• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            統計

            • 隨筆 - 50
            • 文章 - 42
            • 評論 - 147
            • 引用 - 0

            留言簿(6)

            隨筆分類

            文章分類

            Link

            搜索

            •  

            積分與排名

            • 積分 - 164735
            • 排名 - 159

            最新評論

            閱讀排行榜

            評論排行榜

            perl 入門指引
            題記:把這篇文章發到c++專區,沒有嘩眾取寵的意思,這里我想套用阿里巴巴一個資深CTO的話:程序員的知識結構應該是T形的,要精通一到兩門編程語言作為主干,而在頂端則是要多種語言結合使用,也就是我們常說的深度和廣度,那么為什么要學習Perl,我相信有過Perl經驗的程序員一定會對這種腳本語言語義的豐富和強大的字符處理能力有深刻的印象。的確,對于習慣了靜態語言的我們,Perl是個全新的世界,沒有變量聲明,沒有main函數,比起c++, 我覺得perl更向是一個不羈的頑童,perl的語法中充滿了freedom的思想

            假設有以下一個任務,編一個函數將一個文件中所有在尖括號中間的字符由小寫轉換為大寫,這個工作如果用c++來完成的話可能得費一番心思,來看看Perl的解決方案吧
             1#! perl -w
             2&replaceString($ARGV[0];);
             3
             4sub replaceString
             5{
             6    open FILE,"< $_[0]"
             7       or die "can' open file:$!";
             8    while(<FILE>)
             9    {
            10       s/\w*(<[^>]+>)/\U$1/g;
            11       print ;
            12    }

            13}

            以上是perl的解決方案,第一句話是perl的調用語句,對于windows系統意義不大,第二句話是將讀入的第一個參數傳入子例程replaceString,數組ARGV用來存放命令行傳入的參數,接下來就是子例程,其中的核心語句就是s/\w*(<[^>]+>)/\U$1/g;向天書一樣,不過如果你對正則表達式熟悉的,也可以看出一些門道來,這也正是perl語言的強大之處,對于正則表達式的原生支持

            學習perl,首先要忘掉C++古板的作風:
            1,這里沒有main函數,perl不會生成所謂的可執行文件,源文件就是可執行文件,這句話是說給沒有腳本經驗的朋友們的聽的,解釋型語言編譯之后走哪算哪,沒有所謂的入口。
            2.perl中常用的只有3種常量類型,標量、數組和散列
               標量包括常用的字符串,數字,類型是不確定的,perl會根據你的上下文情景做“自然的”轉換,聲明標量使用$前綴
               例如你可以寫出以下語句,輕松得到結果
               $num1=5;
               $num2=5**2;
               print "the square of $num1 is $num2";
               (結果你可以自己試試看)
               而數組則是perl另一個靈活強大的類型,聲明數組使用@前綴,還是以一個例子說明吧
            1#! perl -w
            2   $sentence = "I love c++ and perl";
            3   @words = split " ",$sentence;
            4   print "the sentence \"@words\" has ".@words." words\n";
               輸出是the sentence "I love c++ and perl" has 5 words,是的,你也許意識到,perl自動根據你需要做了轉換,這部分涉及標量上下文和列表上下文(超出本文討論范圍,有興趣可以深入研究),是perl的一個重要特性。然而perl 數組還有許多強大特性,例如,將以上例子稍作修改如下:
            1#! perl -w
            2   $sentence = "I love c++ and perl";
            3   @words = split " ",$sentence;
            4   @words = @words[0,1,4];
            5   print "the sentence \"@words\" has ".@words." words\n";
               有興趣的朋友可以試試看結果

            3, 函數參數列表的括號可加可不加,就像上面調用open函數,正規寫法應該是open(FILE,"$_[0]"),原因就在于perl覺得挪動兩根手指去輸入括號,是很費時的,而大多數情況下不加括號并不會引起歧義

            4,函數的返回值為默認的最后一個表達式的值,請注意,perl的函數沒有void的類型,任何函數都有返回值,且不用你去費事的寫return,而return在perl中又叫“多余的7個字母”

            5,子例程參數列表 @_的使用,你也許會對第一個例子中的子例程replaceString有的意外,沒有參數列表,是的,perl的子例程沒有參數列表,不去規定每個函數可以接受什么參數,多少個參數,所有傳入的參數都會在函數調用的時候自動存入@_這個特殊數組(諸如此類的特殊符號perl中還有許多),而數組的第一個元素可以像這樣應用$_[0],第二個$_[1]...依次類推,所以,我可以將第一個例程稍作修改,使他可以適用于更多的輸入參數,達到一次處理多個文件的效果
             1&replaceString(@ARGV);
             2
             3sub replaceString
             4{
             5    foreach $id (0..@_-1)
             6    {
             7        open FILE,"< $_[$id]"
             8            or die "can' open file $_[$id]:$!";
             9        while(<FILE>)
            10        {
            11           s/\w*(<[^>]+>)/\U$1/g;
            12           print ;
            13        }
                    
            14        close FILE;
            15    }

            16}
            6,以上的例子還可以進一步簡化
             1&replaceString(@ARGV);
             2
             3sub replaceString
             4{
             5    foreach (@_)
             6    {
             7        open FILE,"< $_"
             8            or die "can' open file $_[$id]:$!";
             9        while(<FILE>)
            10        {
            11           s/\w*(<[^>]+>)/\U$1/g;
            12           print ;
            13        }
                    
            14        close FILE;
            15    }

            16}
            注意第5行和第7行的變化,出現了一個新的面孔$_,它成為默認變量,那它默認指代誰呢?在循環語句中,它默認指代循環變量,注意到foreach中省略了他原有的循環變量$id,那這時$_就指向了它,也許你會覺得這回令程序產生歧義,其實這些擔心是多余的,事實上它在perl中很好用,可以使寫出來的程序簡潔優美,perl中還有許多諸如此類的變量:
            $_   默認變量,多用于循環語句指代循環變量
            $!   錯誤信息包含變量,當調用系統API出錯的時候,系統的錯誤信息會自動寫入這個變量
            $`    正則表達式匹配前置變量
            $&   正則表達式匹配變量
            $'  正則表達式匹配后置變量
            $1,$2,$3...   正則表達式匹配臨時變量
            前面兩個我們已經見過了,后面四個都是關于正則表達式的,還是以一個例子說明吧
            #! perl -
            use strict;
            sub readMappingFile
            {
                my ($fileName)
            =@_;
                my 
            %mapping;
                open MAPFILE,
            "< $fileName"
                    or die 
            "can't open file $fileName:$!";
                
            while(<MAPFILE>)
                
            {
                    chomp;
                    
            if(/^(\w+)\s+/)
                    
            {
                        $mapping
            {$1}=$';
                    }

                }
                
                
            %mapping;
            }

            no strict;
            print $ARGV[
            0]." is open\n";
            %mapping=readMappingFile $ARGV[0];
            while(($key,$value)= each %mapping)
            {
                print 
            "$key=>$value\n"
            }

            這個例子需要傳入一個命令行參數,該參數是個文本文件的文件名,程序將讀入文本文件的內容,將它存入散列%mapping中(以%為前綴的變量聲明未散列,相當于C++ STL中的map類型),最后將其打印出來
            例如:文本內容為:
            1         cnblog
            2    cppblog
            csdb    http:
            //blog.csdn.net/dawnbreak/
            cppblog    http://www.shnenglu.com/dawnbreak/    
            將會輸出:
            1.txt is open
            1=>cnblog
            cppblog
            =>http://www.shnenglu.com/dawnbreak/
            2=>cppblog
            csdb
            =>http://blog.csdn.net/dawnbreak/
            注意到各行每兩個健值之間的空格或制表符并不一樣,但是輸出格式確是一致

            這篇文章前前后后寫了很長時間,決定還是先發出來,慢慢更新

            posted on 2009-01-14 21:30 pear_li 閱讀(2071) 評論(9)  編輯 收藏 引用 所屬分類: perl

            評論

            # re: perl 入門指引 2009-01-14 21:43 LOGOS

            perl的作為腳本語言來說,詞法挺糟糕的,不同的重的變量要用$%@&做區分;
            容器的填充樣式也有(){}[]多種規定
            相比lua,變量只要給名字就可以了,容器的填充樣式只有一種{}
            只有在lua缺少相應的模塊的情況下,我才考慮perl,畢竟cpan上東西太多了
              回復  更多評論    

            # re: perl 入門指引 2009-01-14 22:14 pear_li

            @LOGOS
            lua作為嵌入式腳本還不錯,效率較高,但是你說的cpan上東西太多,我想這是perl的優點,一個lua不具備的優點
            至于說那些augly前綴,是很難記,但是我個人還是很喜歡諸如$_,等標記,很靈活
              回復  更多評論    

            # re: perl 入門指引 2009-01-15 09:28 pigvpig

            lua應用于效率要求高的工程,比如:游戲
            perl應用于Web開發,庫非常強大
              回復  更多評論    

            # re: perl 入門指引 2009-01-15 09:43 zuhd

            準備學習lua
              回復  更多評論    

            # re: perl 入門指引 2009-01-15 14:05 

            你如果不懂perl,看到$@%會比較頭痛,就好像美國人看到日語一樣;但是對于懂perl的人,$%@都是非常清晰的數據類型,不會混淆。
              回復  更多評論    

            # re: perl 入門指引 2009-01-15 21:08 pear_li

            @吖
            同意
              回復  更多評論    

            # re: perl 入門指引 2009-01-15 21:09 pear_li

            @zuhd
            也好,其實都是工具而已,不過建議還是多嘗試幾種,你可以去google一下python,沒準你又會改主意,呵呵
              回復  更多評論    

            # re: perl 入門指引 2009-01-16 17:08 guest

            perl需要比較多的時間去適應,當然現在腳本可選的很多了,perl要跟進啊。。呵呵。。
              回復  更多評論    

            # re: perl 入門指引 2009-01-17 16:36 haskell

            支持,繼續
              回復  更多評論    
            亚洲AV无码久久精品蜜桃| 青青青青久久精品国产h| 狠狠色丁香久久婷婷综合图片| 欧美久久一区二区三区| 亚洲第一极品精品无码久久| 久久综合九色综合97_久久久| 久久综合久久综合久久| 欧美亚洲日本久久精品| 国内精品九九久久久精品| 精品久久久久国产免费| 色欲综合久久中文字幕网| 国产精品九九久久免费视频| 国内精品久久久久影院亚洲| 93精91精品国产综合久久香蕉| 国产精品久久久久久久久软件| 国产精品久久永久免费| 久久久噜噜噜久久中文字幕色伊伊| 精品久久久久久亚洲| 99久久精品国产一区二区 | 久久精品视频91| 亚洲国产欧美国产综合久久 | 亚州日韩精品专区久久久| 国产91久久精品一区二区| 久久久久久久综合狠狠综合| 精品欧美一区二区三区久久久 | 国内精品久久国产大陆| 伊人久久大香线蕉AV色婷婷色| 久久人人爽人人爽人人片AV麻豆 | 熟妇人妻久久中文字幕| 综合久久一区二区三区| 久久www免费人成精品香蕉| 国产亚洲欧美成人久久片| 蜜臀av性久久久久蜜臀aⅴ| 久久久这里只有精品加勒比| 理论片午午伦夜理片久久| 国产精品99久久久久久宅男| 久久久久久免费一区二区三区| 精品无码久久久久久午夜| 国产成人精品免费久久久久| 久久精品麻豆日日躁夜夜躁| 久久亚洲精品人成综合网|