Perl 的特殊變數算是語言中最怪異的。 此文分為兩單元,介紹
perl 的特殊變數 $_,$& 和 $!
$_
$_ 這個以中文來說,就是「這一個變數」,也是所有迴圈會用到的預設變數。例如要讓perl 印出1到100:
for(1..100){ print $_; }
結果:1234567891011121...中間略....96979899100
第2行的 $_ 就是預設的變數,代表目前迴圈所指示的數。等同於C寫的
對perl 來說變數都省略。
$_ 在巢狀迴圈就要格外小心,因為在內層迴圈中的 $_ 代表是內層迴圈變數,在外層迴圈的代表的是外層迴圈的變數。
for(5..7){ print "$_\n"; for(1..3){ print "child $_\n"; } }
結果:
5
child 1
child 2
child 3
6
child 1
child 2
child 3
7
child 1
child 2
child 3
$&
$& 代表比對範圍內的全部結果,來看以下例子
$str="This is an international issue ."; if( $str =~ /is/) { print "\$&=$&\n"; }
結果
$&=ldap; (program; !slapd) and (level; info..err)
$+=(program; !slapd) and (level; info..err)
為什麼需要 $+,而不直接用 $1 取出第一個比對的結果,我特別舉這個例子,因為比對的條件有兩個,結果可能會是其中一個條件符合,可能是其中第2或第3 個比對的結果,如果不能確定是 $2, $3 ,就用$+ 來取最後一個吧。另外一個理由:在 | 的右邊,他的變數是繼續算下去,而不是從1再開始算。
至於$&則是取得符合比對內容的部分,不是取回全部字串喔。
$!
$! 這特殊變數會顯示錯誤的訊息,但還是有一點差別,看以下開啟檔案的例子,假設檔案 test.txt 並不存在:
結果:
沒有此一檔案或目錄 at ./oparse.pl line 32.
$! 有說明錯誤和行號
這時把 $! 寫到引號中,再加一個換行,他就不會顯示錯誤的行號了。
結果:
沒有此一檔案或目錄
如果要再懶一點,連 $! 都省了,但是出來的結果訊息就不知錯誤詳情了。
結果:
Died at ./example.pl line 32
編輯 2009-11-18 21:06:12