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

            那誰的技術(shù)博客

            感興趣領(lǐng)域:高性能服務(wù)器編程,存儲,算法,Linux內(nèi)核
            隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
            數(shù)據(jù)加載中……

            Perl學(xué)習(xí)筆記(二)--my, our, local 以及 typeglob

            Perl中有兩種名字空間(namespace):符號表(symbol table)和詞法作用域(lexical scopes).在Perl中, 每個包(Package)有一個
            符號表, 可以通過Packeagename::獲取包中的變量.
            比如:
            package A;
            $test = 1;
            可以通過$A::test訪問包A的變量test.
            符號表是一個Hash表, 該Hash表的名字就是符號表所在包的名字.
            比如你可以用下面的語句打印出在main包中的所有符號:
            foreach (keys %main::)
            {
                print $_, "\n";
            }

            又比如, 如果在程序中聲明了:
            $test = 1;
            可以通過$main::test來訪問該變量(假設(shè)變量是在main包中).

            在同一個符號表中, 可以存在同樣名字的標(biāo)量變量, 數(shù)組變量, Hash變量, 函數(shù)變量等.Perl中采用*符號來表示一個typeglobs,意思
            就是"所有名字為XX的變量",比如:
            $type = *test;
            此時變量type中存放的就是當(dāng)前包中所有名字為test的變量,
            如果我們調(diào)用語句:
            print $$type;
            則將$type所指向的變量解釋為標(biāo)量, 類似的可以解釋為數(shù)組, Hash, 函數(shù)等等.

            但是, 如果你僅僅想讓這個typeglobs作用于一個類型的變量, 也可以明確的指出來, 如:
            *dick = \$richard;
            這樣dick變量就只能訪問名為richard的標(biāo)量了.

            可以把typeglobs想象為另一個typeglobs的別名, 當(dāng)寫下代碼
            $type = *test;
            的時候, type就是test這個typeglobs的別名了.

            Perl中還支持符號引用, 它可以根據(jù)一個標(biāo)量存放的字符串去查找名為該字符串的typeglobs,如:
            $test = 1;
            $name = "test";
            print $$name;
            Perl解釋器首先去解釋變量$name, 發(fā)現(xiàn)是一個字符串, 再根據(jù)該字符串去解釋這個解引用, 也就是說:
            $$name -> $test -> 1


            在Perl中, 變量的名字是可以和Perl的關(guān)鍵字同名的, 只要在使用的時候有"足夠的辦法"讓Perl解釋器去明確辨別出來到底是哪種變量.
            比如我寫了一個名為for的函數(shù), 一般而言, 在Perl中, 函數(shù)調(diào)用是可以省略掉前面的&符號的, 但是在這里對這個名為for的函數(shù)則不行,
            Perl會把它解釋為for循環(huán).因此, 要明確的表示是在調(diào)用一個叫for的函數(shù), 需要在前面加上&符號.對其它類型的變量, 這個例子同樣適用.
            在<<Perl語言編程>>(大駱駝)中, 將$&%@這幾種分別作用在不同類型變量前面的特殊符號稱之為"funny character".

            在Perl中, 有三種修飾符是修飾變量的作用域的:our, my, local,它們與前面提到的Perl中的作用域息息相關(guān).
            our聲明的變量是包全局的, 也就是說, our聲明的變量會出現(xiàn)在這個包的符號表中;my聲明的變量僅作用于一個塊(block), 在Perl中,
            一對{}包起來的部分稱之為一個塊, 比如一個函數(shù)是一個塊, 一個循環(huán)是一個塊,等等,my修飾的變量普遍作用于這些地方, 如果沒有在哪一個
            塊中, 那么就僅作用于當(dāng)前文件, 但是,無論如何, my修飾的變量都不會進(jìn)入一個包的符號表中, 這也就意味著my聲明的變量不能使用typeglobs
            進(jìn)行訪問, 如:
            my $test = 1;

            $type = *test;
            print $$type;
            這段代碼是沒有任何效果的, 因?yàn)樵诋?dāng)前包中找不到名字是test的變量.把上面代碼中修飾變量test的my去掉, 再試試就知道區(qū)別了.

            local是作用于那些在符號表中出現(xiàn)的變量的, 它讓對這些變量的修改局限在一個塊(block)中, 比如:
            our $var;
            $var = 1;
            {
                local $var;
                $var = 2;
                print $var, "\n";
            }
            print $var, "\n";
            打印的結(jié)果是
            2
            1
            local的出現(xiàn)讓塊中對變量var的修改僅僅局限在這個塊中了.

            總結(jié):
            1. Perl中有兩個作用域:符號表和詞法作用域, 每個包都有自己的符號表, 這樣可以避免名字污染問題的出現(xiàn), 類似于C++中的
            namespace, 全局變量, 以及用our修飾的變量都屬于這個作用域, 可以通過:包名稱::變量名稱來訪問一個包中的全局變量.而詞法作用域
            是指的一個塊, 或者一個文件, 凡是由my修飾的變量都是詞法作用域中的變量, 它們不會出現(xiàn)在包中的符號表中, 在包之外不可見,
            更甚者, 如果一個由my修飾的變量在一個塊中, 它就僅僅在這個塊中可見了.

            2. 如果想讓對某個全局變量的修改局部化, 那么就使用local修飾符, 在出了這個塊之后, 自動恢復(fù)為全局變量原來的數(shù)據(jù).

            posted on 2008-07-31 14:09 那誰 閱讀(4777) 評論(0)  編輯 收藏 引用 所屬分類: Perl

            欧美与黑人午夜性猛交久久久| 国产精品久久久久久久| 久久亚洲国产精品五月天婷| 亚洲国产另类久久久精品小说| 久久综合亚洲色HEZYO社区| 久久九九久精品国产免费直播| 国产免费久久久久久无码| 国内精品伊人久久久久妇| 久久香蕉超碰97国产精品| 久久国产精品一区| 久久精品人人做人人爽97| 天堂无码久久综合东京热| 国内精品久久久久久99蜜桃| 四虎国产精品成人免费久久| 久久婷婷综合中文字幕| 四虎久久影院| 国产69精品久久久久9999| 午夜精品久久久久久中宇| 久久久免费观成人影院| 亚洲综合久久综合激情久久| 一本一本久久aa综合精品| 国产A级毛片久久久精品毛片| 国产一区二区精品久久岳| 亚洲国产精品高清久久久| 亚洲精品无码专区久久同性男| 91精品国产综合久久四虎久久无码一级| 中文国产成人精品久久不卡| 久久精品这里只有精99品| 青青热久久综合网伊人| 久久成人影院精品777| 久久亚洲精品人成综合网| 婷婷久久香蕉五月综合加勒比| 97香蕉久久夜色精品国产| 亚洲欧美国产精品专区久久| 久久国产成人午夜AV影院| 久久国产高清一区二区三区| 久久精品中文字幕第23页| 久久无码人妻精品一区二区三区| 久久久久久av无码免费看大片| 久久精品中文字幕有码| 久久只有这精品99|