[精讚] [會員登入]
557

Perl 的特殊變數:$_、$&、$!

介紹perl的特殊變數 $_ 、 $&、$!

此文完整連結 http://n.sfs.tw/12996

複製連結 Perl 的特殊變數:$_、$&、$!@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2019-10-25 14:11:30 最後編修
2019-01-04 11:28:36 By 張○○
 

Perl 的特殊變數算是語言中最怪異的。 此文分為兩單元,介紹

perl 的特殊變數 $_,$& 和 $!

 

$_

$_  這個以中文來說,就是「這一個變數」,也是所有迴圈會用到的預設變數。例如要讓perl 印出1到100:

for(1..100){
    print $_;
}

結果:1234567891011121...中間略....96979899100

第2行的 $_ 就是預設的變數,代表目前迴圈所指示的數。等同於C寫的

  for( int ii; ii<=100; ii++){ printf ("%d",ii);  }

對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 並不存在:

open(FILE, "test.txt") or die $!;

結果:
沒有此一檔案或目錄 at ./oparse.pl line 32.

$! 有說明錯誤和行號

 

這時把 $! 寫到引號中,再加一個換行,他就不會顯示錯誤的行號了。

open(FILE, "test.txt") or die "$!\n";

結果:
沒有此一檔案或目錄

 

如果要再懶一點,連 $! 都省了,但是出來的結果訊息就不知錯誤詳情了。

open(FILE, "test.txt") or die;

結果:
Died at ./example.pl line 32

 


編輯 2009-11-18 21:06:12

你可能感興趣的文章

[PERL] 01-撰寫第一隻PERL程式 PERL的系列教學文,適合有其他程式經驗但沒學過PERL的人

[PERL] 14-進階比對 #1--取回比對內容 perl的正規表達式進階比對

[PERL] 位元運算 Bitwise operation PERL的位元運算整理

[PERL] 03-條件式判斷 perl的條件式判斷

自行撰寫syslog server建立資訊安全控管中心#4 -- 過濾條件設定 利用PERL將syslog收攏到資料庫的程式,過濾條件設定

[PERL] 前置if和後置if (if修飾子)的差別 perl的if可以拿來作為後置修飾子使用,此外還有一個unless像是if的相反,分析他們的差異

自行撰寫syslog server建立資訊安全控管中心#1 -- 前言及syslog介紹 利用PERL將syslog收攏到資料庫的程式

[PERL] 10- 雜湊 Perl 的hash 指標陣列

[PERL] 12- 副程式 Perl 的副程式就是所謂的函數

[PERL] 07-陣列 #1 -- 基本 perl的陣列

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。請注意:留言不可帶有網址,會被濾掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

UTF-8 BOM (Byte Order Mark) 的問題 在 Michael Kaplan 那看到 Every character has a story #4: U+feff

維修冰箱 維修冰箱

一個邏輯的錯誤刪了全部檔案的經驗 今天本來想做一件很簡單的事,但卻足足浪費我多一倍的時間,再加上刪掉我全部的檔案,原因只是因為我自己的邏輯錯誤。

NETCRAFT發現你的網站及作業系統 NETCRAFT可以發現你的網站及作業系統

[PHP] 檢查IP是否在某個網段內 mtachcidr 要檢查IP是否在某個網段內,要寫幾行?10行?5行? 不用,只要2行。以下是我寫的 code /** * matchCI