[精讚] [會員登入]
6040

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

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

分享此文連結 //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

END

你可能感興趣的文章

[PERL] 20- 檔案目錄處理 PERL寫入和讀出檔案

[PERL] 08-陣列 #2 --操作 更多perl陣列的操作,如拆開、黏合、取出、加入等等

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

[PERL] 04-基本比對 perl的正規表達示基本比對

自行撰寫syslog server建立資訊安全控管中心#2 -- 架構和作法 利用PERL將syslog收攏到資料庫的程式,架構和作法

PERL一次讀取檔案所有內容的方法($/) perl可以使用slurp mode一次讀完檔案所有內容的方法及一些範例

隨機好文

使用Google尋找你的手機 這近發現google竟然可以用來找android的手機,而且不需要經過什麼設定或安裝軟體。

談借錢 人借錢時手心向上頭向下,人還錢時手心向下頭向上

SELinux 常用指令和檔案 在Redhat系列中,Centos5以後加入了selinux,他並沒有這麼可怕,不必每次看到Selinux ,就想把他

[Freebsd] 定時測試 ADSL 是否斷線並重連 中華電信 ADSL 雖有固定 ip,可是他卻會不定時「斷線」, 使用以下的 方法可以定時測試是否斷線,以及重新撥接。

PHP for sphinx 函式庫安裝 PECL/sphinx PHP>= 5.2.2 已經能原生支援 sphinx,可是預設的沒有裝,我們得自己裝才能用