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

            搜索

            •  

            積分與排名

            • 積分 - 164774
            • 排名 - 159

            最新評論

            閱讀排行榜

            評論排行榜

            如何理解Perl語言中的Glob

             

            本文假設你對Perl引用已經有所了解。

            關于Perl glob,筆者建議閱讀《Advanced Perl Programming》第一版的第三章和第二版的第一章。本文是筆者經過閱讀以上內容并經過一些實踐后完成的。

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

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

            引用都可以簡單地看成是存儲了變量的地址:

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

            在各種語言里,都有符號表(Symbol Table)的概念。符號表存儲著各種作用域里的符號(Symbol)。這里說的Symbol是指我們編程時用到的各種名稱,包括變量名、函數名等。比如上面的“a”、“pa”、“ra”等都是symbol。看下面的代碼:

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

            產生的符號表:

            ... ...
            symbol a 變量$a的地址
            ... ...
            symbol b $b的地址 @b的地址 %b的地址 函數b的地址
            ... ...

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

            glob的一個基本應用是alias(別名):

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

            運行結果:

            10
            20
            

            符號表:

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

            通過將引用賦給glob可以實現部分別名:

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

            輸出:

            6
            7
            

            符號表:

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

            可以看到,只是標量一樣了,數組還是各自的。

            還可以用于參數傳遞:

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

            運行結果:

            tt
            cc

            據說通過glob傳遞參數要比傳引用快很多。

            不同的作用域有不同的符號表:函數擁有自己的符號表,各個包也有自己的符號表。注意!詞法變量(lexical variable,用my關鍵字聲明的變量)不收入符號表。同時,也不能用my關鍵字來聲明glob。my關鍵字只用來聲明詞法變量,glob不是詞法變量。

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

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

            輸出:

            234
            345

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

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

            欧美亚洲日本久久精品| 久久精品亚洲福利| 久久久国产亚洲精品| 久久久久久极精品久久久| 色综合合久久天天综合绕视看 | 99久久国产综合精品麻豆| 波多野结衣AV无码久久一区| 久久综合偷偷噜噜噜色| 一级a性色生活片久久无少妇一级婬片免费放 | …久久精品99久久香蕉国产| 久久永久免费人妻精品下载| 亚洲香蕉网久久综合影视| 日韩乱码人妻无码中文字幕久久| 久久国语露脸国产精品电影| 新狼窝色AV性久久久久久| 久久精品国产乱子伦| 日韩精品久久久久久久电影蜜臀 | 久久99国内精品自在现线| 久久精品国产亚洲AV麻豆网站| 久久综合九色综合网站| 久久国产精品一区二区| 国产精品免费看久久久香蕉| 久久精品成人| 99精品久久久久久久婷婷| 久久久久女人精品毛片| 青青青国产精品国产精品久久久久| 国产高清美女一级a毛片久久w| 国产毛片久久久久久国产毛片 | 久久精品二区| 久久亚洲精品无码aⅴ大香| 亚洲女久久久噜噜噜熟女| 国产精品99久久久久久人| 国内精品久久久久久久coent| 人妻精品久久久久中文字幕| 亚洲综合精品香蕉久久网| 一本色道久久88加勒比—综合| 亚洲日本va午夜中文字幕久久| 久久亚洲日韩精品一区二区三区| 久久综合狠狠综合久久激情 | 偷偷做久久久久网站| 久久免费视频网站|