如何理解Perl語言中的Glob
本文假設(shè)你對Perl引用已經(jīng)有所了解。 關(guān)于Perl glob,筆者建議閱讀《Advanced Perl Programming》第一版的第三章和第二版的第一章。本文是筆者經(jīng)過閱讀以上內(nèi)容并經(jīng)過一些實踐后完成的。 我們都知道Perl的引用類似C語言的指針。 C指針:
int a = 1; int* pa; pa = &a; Perl引用:
my $a = 3; my $ra = \$a; 引用都可以簡單地看成是存儲了變量的地址:
在各種語言里,都有符號表(Symbol Table)的概念。符號表存儲著各種作用域里的符號(Symbol)。這里說的Symbol是指我們編程時用到的各種名稱,包括變量名、函數(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)生的符號表:
可以看到symbol b里存放了好幾個變量和函數(shù)的引用。在Perl里,symbol也可以被叫做glob。symbol b和symbal a可以分別用*b和*a表示。 glob的一個基本應(yīng)用是alias(別名): $a = 10; *b = *a; print $b . "\n"; $b = 20; print $a . "\n"; 運行結(jié)果: 10 20 符號表:
通過將引用賦給glob可以實現(xiàn)部分別名: $a = 6; @a = (1,2); @b = (5,6); print $a . "\n"; *b = \$a; $b = 7; print $a . "\n"; 輸出: 6 7 符號表:
可以看到,只是標(biāo)量一樣了,數(shù)組還是各自的。 還可以用于參數(shù)傳遞: sub change { *b = shift; $b = "cc"; } $a = "tt"; print $a . "\n"; change(*a); print $a . "\n"; 運行結(jié)果: tt
cc
據(jù)說通過glob傳遞參數(shù)要比傳引用快很多。 不同的作用域有不同的符號表:函數(shù)擁有自己的符號表,各個包也有自己的符號表。注意!詞法變量(lexical variable,用my關(guān)鍵字聲明的變量)不收入符號表。同時,也不能用my關(guān)鍵字來聲明glob。my關(guān)鍵字只用來聲明詞法變量,glob不是詞法變量。 《Advance Perl Programming》第二版里說:可以把glob看成一個很有限的hash,他只有幾個key:SCALAR、ARRAY、HASH, IO, CODE, FORMAT和GLOB(筆者注:保存GLOB引用),另外還有兩個key:PACKAGE和NAME(筆者注:僅做自省用)。比如一個glob:a,*a{SCALAR}就相當(dāng)于\$a,*a{HASH}就相當(dāng)于\%a等等。 $a = 234; print $a . "\n"; ${*a{SCALAR}} = 345; print $a . "\n"; 輸出: 234
|
|