• <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>

            統(tǒng)計(jì)

            • 隨筆 - 50
            • 文章 - 42
            • 評(píng)論 - 147
            • 引用 - 0

            留言簿(6)

            隨筆分類

            文章分類

            Link

            搜索

            •  

            積分與排名

            • 積分 - 165556
            • 排名 - 159

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

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

            假設(shè)有以下一個(gè)任務(wù),編一個(gè)函數(shù)將一個(gè)文件中所有在尖括號(hào)中間的字符由小寫轉(zhuǎn)換為大寫,這個(gè)工作如果用c++來(lái)完成的話可能得費(fèi)一番心思,來(lái)看看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的調(diào)用語(yǔ)句,對(duì)于windows系統(tǒng)意義不大,第二句話是將讀入的第一個(gè)參數(shù)傳入子例程replaceString,數(shù)組ARGV用來(lái)存放命令行傳入的參數(shù),接下來(lái)就是子例程,其中的核心語(yǔ)句就是s/\w*(<[^>]+>)/\U$1/g;向天書一樣,不過(guò)如果你對(duì)正則表達(dá)式熟悉的,也可以看出一些門道來(lái),這也正是perl語(yǔ)言的強(qiáng)大之處,對(duì)于正則表達(dá)式的原生支持

            學(xué)習(xí)perl,首先要忘掉C++古板的作風(fēng):
            1,這里沒有main函數(shù),perl不會(huì)生成所謂的可執(zhí)行文件,源文件就是可執(zhí)行文件,這句話是說(shuō)給沒有腳本經(jīng)驗(yàn)的朋友們的聽的,解釋型語(yǔ)言編譯之后走哪算哪,沒有所謂的入口。
            2.perl中常用的只有3種常量類型,標(biāo)量、數(shù)組和散列
               標(biāo)量包括常用的字符串,數(shù)字,類型是不確定的,perl會(huì)根據(jù)你的上下文情景做“自然的”轉(zhuǎn)換,聲明標(biāo)量使用$前綴
               例如你可以寫出以下語(yǔ)句,輕松得到結(jié)果
               $num1=5;
               $num2=5**2;
               print "the square of $num1 is $num2";
               (結(jié)果你可以自己試試看)
               而數(shù)組則是perl另一個(gè)靈活強(qiáng)大的類型,聲明數(shù)組使用@前綴,還是以一個(gè)例子說(shuō)明吧
            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,是的,你也許意識(shí)到,perl自動(dòng)根據(jù)你需要做了轉(zhuǎn)換,這部分涉及標(biāo)量上下文和列表上下文(超出本文討論范圍,有興趣可以深入研究),是perl的一個(gè)重要特性。然而perl 數(shù)組還有許多強(qiáng)大特性,例如,將以上例子稍作修改如下:
            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";
               有興趣的朋友可以試試看結(jié)果

            3, 函數(shù)參數(shù)列表的括號(hào)可加可不加,就像上面調(diào)用open函數(shù),正規(guī)寫法應(yīng)該是open(FILE,"$_[0]"),原因就在于perl覺得挪動(dòng)兩根手指去輸入括號(hào),是很費(fèi)時(shí)的,而大多數(shù)情況下不加括號(hào)并不會(huì)引起歧義

            4,函數(shù)的返回值為默認(rèn)的最后一個(gè)表達(dá)式的值,請(qǐng)注意,perl的函數(shù)沒有void的類型,任何函數(shù)都有返回值,且不用你去費(fèi)事的寫return,而return在perl中又叫“多余的7個(gè)字母”

            5,子例程參數(shù)列表 @_的使用,你也許會(huì)對(duì)第一個(gè)例子中的子例程replaceString有的意外,沒有參數(shù)列表,是的,perl的子例程沒有參數(shù)列表,不去規(guī)定每個(gè)函數(shù)可以接受什么參數(shù),多少個(gè)參數(shù),所有傳入的參數(shù)都會(huì)在函數(shù)調(diào)用的時(shí)候自動(dòng)存入@_這個(gè)特殊數(shù)組(諸如此類的特殊符號(hào)perl中還有許多),而數(shù)組的第一個(gè)元素可以像這樣應(yīng)用$_[0],第二個(gè)$_[1]...依次類推,所以,我可以將第一個(gè)例程稍作修改,使他可以適用于更多的輸入?yún)?shù),達(dá)到一次處理多個(gè)文件的效果
             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,以上的例子還可以進(jìn)一步簡(jiǎn)化
             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行的變化,出現(xiàn)了一個(gè)新的面孔$_,它成為默認(rèn)變量,那它默認(rèn)指代誰(shuí)呢?在循環(huán)語(yǔ)句中,它默認(rèn)指代循環(huán)變量,注意到foreach中省略了他原有的循環(huán)變量$id,那這時(shí)$_就指向了它,也許你會(huì)覺得這回令程序產(chǎn)生歧義,其實(shí)這些擔(dān)心是多余的,事實(shí)上它在perl中很好用,可以使寫出來(lái)的程序簡(jiǎn)潔優(yōu)美,perl中還有許多諸如此類的變量:
            $_   默認(rèn)變量,多用于循環(huán)語(yǔ)句指代循環(huán)變量
            $!   錯(cuò)誤信息包含變量,當(dāng)調(diào)用系統(tǒng)API出錯(cuò)的時(shí)候,系統(tǒng)的錯(cuò)誤信息會(huì)自動(dòng)寫入這個(gè)變量
            $`    正則表達(dá)式匹配前置變量
            $&   正則表達(dá)式匹配變量
            $'  正則表達(dá)式匹配后置變量
            $1,$2,$3...   正則表達(dá)式匹配臨時(shí)變量
            前面兩個(gè)我們已經(jīng)見過(guò)了,后面四個(gè)都是關(guān)于正則表達(dá)式的,還是以一個(gè)例子說(shuō)明吧
            #! 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"
            }

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

            這篇文章前前后后寫了很長(zhǎng)時(shí)間,決定還是先發(fā)出來(lái),慢慢更新

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

            評(píng)論

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

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

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

            @LOGOS
            lua作為嵌入式腳本還不錯(cuò),效率較高,但是你說(shuō)的cpan上東西太多,我想這是perl的優(yōu)點(diǎn),一個(gè)lua不具備的優(yōu)點(diǎn)
            至于說(shuō)那些augly前綴,是很難記,但是我個(gè)人還是很喜歡諸如$_,等標(biāo)記,很靈活

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

            lua應(yīng)用于效率要求高的工程,比如:游戲
            perl應(yīng)用于Web開發(fā),庫(kù)非常強(qiáng)大

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

            準(zhǔn)備學(xué)習(xí)lua

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

            你如果不懂perl,看到$@%會(huì)比較頭痛,就好像美國(guó)人看到日語(yǔ)一樣;但是對(duì)于懂perl的人,$%@都是非常清晰的數(shù)據(jù)類型,不會(huì)混淆。

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

            @吖
            同意

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

            @zuhd
            也好,其實(shí)都是工具而已,不過(guò)建議還是多嘗試幾種,你可以去google一下python,沒準(zhǔn)你又會(huì)改主意,呵呵

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

            perl需要比較多的時(shí)間去適應(yīng),當(dāng)然現(xiàn)在腳本可選的很多了,perl要跟進(jìn)啊。。呵呵。。

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

            支持,繼續(xù)

            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            相關(guān)文章:
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            性做久久久久久免费观看| 999久久久免费国产精品播放| 欧美黑人激情性久久| 久久久久人妻一区二区三区vr | 亚洲午夜久久久影院| 久久人人爽人人爽人人片AV不 | 2020国产成人久久精品 | 亚洲国产精品狼友中文久久久| 欧美激情一区二区久久久| 久久久国产精品亚洲一区| 久久成人18免费网站| 一本色道久久99一综合| 国产AV影片久久久久久| 成人午夜精品无码区久久| 久久精品一区二区国产| 亚洲性久久久影院| 蜜桃麻豆www久久| 东方aⅴ免费观看久久av| 国产成人久久精品二区三区| 亚洲精品无码成人片久久| 精品久久久久久99人妻| 老色鬼久久亚洲AV综合| 亚洲人成电影网站久久| 久久亚洲国产中v天仙www| 日本欧美久久久久免费播放网 | 久久精品国产亚洲7777| 国产精品一久久香蕉国产线看观看| 日韩一区二区三区视频久久| 久久99精品国产一区二区三区| 久久精品一本到99热免费| 狠狠久久综合伊人不卡| 99re久久精品国产首页2020| 99精品国产综合久久久久五月天| 久久精品国产亚洲Aⅴ香蕉| 狠色狠色狠狠色综合久久| 亚洲日韩中文无码久久| 伊人久久大香线蕉精品不卡| 久久久久国产精品嫩草影院 | 99久久精品国产一区二区 | 久久人人爽人人澡人人高潮AV| 国产精品18久久久久久vr|