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

            搜索

            •  

            積分與排名

            • 積分 - 164777
            • 排名 - 159

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            如何理解Perl語(yǔ)言中的Glob

             

            本文假設(shè)你對(duì)Perl引用已經(jīng)有所了解。

            關(guān)于Perl glob,筆者建議閱讀《Advanced Perl Programming》第一版的第三章和第二版的第一章。本文是筆者經(jīng)過(guò)閱讀以上內(nèi)容并經(jīng)過(guò)一些實(shí)踐后完成的。

            我們都知道Perl的引用類似C語(yǔ)言的指針。

            C指針:
            int a = 1;
            int* pa;
            pa = &a;
            
            Perl引用:
            my $a = 3;
            my $ra = \$a;
            

            引用都可以簡(jiǎn)單地看成是存儲(chǔ)了變量的地址:

            $a $ra
            3 變量$a的地址

            在各種語(yǔ)言里,都有符號(hào)表(Symbol Table)的概念。符號(hào)表存儲(chǔ)著各種作用域里的符號(hào)(Symbol)。這里說(shuō)的Symbol是指我們編程時(shí)用到的各種名稱,包括變量名、函數(shù)名等。比如上面的“a”、“pa”、“ra”等都是symbol??聪旅娴拇a:

            my $a = "sdd";
            my $b = 34;
            my @b = (2,3);
            my %b = (name => 'me', age => 28);
            sub b {
            print "hello\n";
            }
            

            產(chǎn)生的符號(hào)表:

            ... ...
            symbol a 變量$a的地址
            ... ...
            symbol b $b的地址 @b的地址 %b的地址 函數(shù)b的地址
            ... ...

            可以看到symbol b里存放了好幾個(gè)變量和函數(shù)的引用。在Perl里,symbol也可以被叫做glob。symbol b和symbal a可以分別用*b和*a表示。

            glob的一個(gè)基本應(yīng)用是alias(別名):

            $a = 10;
            *b = *a;
            print $b . "\n";
            $b = 20;
            print $a . "\n";
            

            運(yùn)行結(jié)果:

            10
            20
            

            符號(hào)表:

            ... ...
            *a \$a
            ... ...
            *b \$a
            ... ...

            通過(guò)將引用賦給glob可以實(shí)現(xiàn)部分別名:

            $a = 6;
            @a = (1,2);
            @b = (5,6);
            print $a . "\n";
            *b = \$a;
            $b = 7;
            print $a . "\n";
            

            輸出:

            6
            7
            

            符號(hào)表:

            ... ...
            *a \$a \@a
            ... ...
            *b \$a \@b
            ... ...

            可以看到,只是標(biāo)量一樣了,數(shù)組還是各自的。

            還可以用于參數(shù)傳遞:

            sub change {
            *b = shift;
            $b = "cc";
            }
            $a = "tt";
            print $a . "\n";
            change(*a);
            print $a . "\n";
            

            運(yùn)行結(jié)果:

            tt
            cc

            據(jù)說(shuō)通過(guò)glob傳遞參數(shù)要比傳引用快很多。

            不同的作用域有不同的符號(hào)表:函數(shù)擁有自己的符號(hào)表,各個(gè)包也有自己的符號(hào)表。注意!詞法變量(lexical variable,用my關(guān)鍵字聲明的變量)不收入符號(hào)表。同時(shí),也不能用my關(guān)鍵字來(lái)聲明glob。my關(guān)鍵字只用來(lái)聲明詞法變量,glob不是詞法變量。

            《Advance Perl Programming》第二版里說(shuō):可以把glob看成一個(gè)很有限的hash,他只有幾個(gè)key:SCALAR、ARRAY、HASH, IO, CODE, FORMAT和GLOB(筆者注:保存GLOB引用),另外還有兩個(gè)key:PACKAGE和NAME(筆者注:僅做自省用)。比如一個(gè)glob:a,*a{SCALAR}就相當(dāng)于\$a,*a{HASH}就相當(dāng)于\%a等等。

            $a = 234;
            print $a . "\n";
            ${*a{SCALAR}} = 345;
            print $a . "\n";
            

            輸出:

            234
            345

            GLOB是Perl中幾個(gè)比較難的概念之一。在Perl的核心庫(kù)里,處處用到各種高深的glob技術(shù)。比如Exporter、AUTOLOAD、CORE等。雖然一般編程不需要用到特別深入的技術(shù)。如果能多了解一些,對(duì)于我們編程還是會(huì)大有益處的。 

            posted on 2009-05-19 15:04 pear_li 閱讀(1116) 評(píng)論(0)  編輯 收藏 引用


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


            99久久精品九九亚洲精品| 99久久婷婷免费国产综合精品| 久久99热国产这有精品| 久久综合久久综合九色| 日韩影院久久| 青青草国产成人久久91网| 久久久精品日本一区二区三区| 国产香蕉久久精品综合网| 久久久久久夜精品精品免费啦| 一级做a爰片久久毛片16| 77777亚洲午夜久久多人| 99久久国产主播综合精品| 久久久午夜精品福利内容| 久久久久国产精品| 久久久噜噜噜久久熟女AA片 | 亚洲国产成人久久综合野外| 精品久久久一二三区| 天天久久狠狠色综合| 久久人人爽人人爽人人片AV不| 久久毛片免费看一区二区三区| 久久超碰97人人做人人爱| 国产精品一区二区久久精品涩爱| 狠狠狠色丁香婷婷综合久久俺| 久久久久久精品久久久久| 久久强奷乱码老熟女网站| 91久久九九无码成人网站| 国内精品久久久久影院优| 久久九九兔免费精品6| 亚洲国产成人精品女人久久久 | 成人妇女免费播放久久久| 久久精品中文字幕第23页| 精品久久久久久亚洲| 丰满少妇高潮惨叫久久久| 久久国产精品成人片免费| 欧美精品久久久久久久自慰| 午夜欧美精品久久久久久久| 精品综合久久久久久98| 久久久久av无码免费网| 亚洲va久久久噜噜噜久久| 人妻无码αv中文字幕久久琪琪布 人妻无码久久一区二区三区免费 人妻无码中文久久久久专区 | 成人久久综合网|