Perl 特殊變數


Perl 語言中定義了一些特殊的變量,通常以 $, @, 或 % 作為前綴,例如:$_。

很多特殊的變數有一個很長的英文名,作業系統變數 $! 可以寫為 $OS_ERROR。

如果你想使用英文名的特殊變數需要在程式頭上加上 use English;。這樣就可以使用具有描述性的英文特殊變數。

最常用的特殊變數為 $_,該變數包含了預設輸入和模式匹配內容。實例如下:

#!/usr/bin/perl

foreach ('Google','php','Taobao') {
	print $_;
	print "\n";
}

執行上述程序,輸出結果為:

Google
php
Taobao

以下實例我們不使用$_ 來輸出內容:

#!/usr/bin/perl

foreach ('Google','php','Taobao') {
	print;
	print "\n";
}

執行以上程序,輸出結果為:

Google
php
Taobao

實例中,先輸出"Google" ,接著輸出"php" ,最後輸出"Taobao" 。

在迭代循環中,目前循環的字串會放在 $_ 中, 然後 透過 print 輸出。另外 print 在不指定輸出變量,預設使用的也是 $_。

以下是幾個即使沒有寫明Perl 也會假定使用$_ 的地方:

  • 各種單目函數,包括像ord() 和int( ) 這樣的函數以及除"-t"以外所有的檔案測試操作("-f","-d"),"-t" 預設操作STDIN。

  • 各種列表函數,例如 print() 和 unlink()。

  • 沒有使用 "=~" 運算子時的模式比對操作 "m//"、"s///" 和"tr///"。

  • 在沒有給出其他變數時是 "foreach" 迴圈的預設迭代變數。

  • grep() 和 map() 函數的隱含迭代變數。

  • 當 "while" 僅有唯一條件,且該條件是對 ""操作的結果進行測試時,$_ 是存放輸入記錄的預設位置。除了"while" 測試條件之外不會發生這種情況。 (助記:底線在特定運算中是可以省略的。)


#特殊變數型別

依特殊的變數的使用性質,可以分為以下幾類:

  • 全域標量特殊變數。

  • 全域數組特殊變數。

  • 全域哈希特殊變數。

  • 全域特殊檔案句柄。

  • 全域特殊常數。

  • 正規表示式特殊變數。

  • 檔案句柄特殊變數。

全域標量特殊變數

以下列出了所有的標量特殊變量,包含了特殊字元與英文形式的變數:

##$##列印數字時預設的數字輸出格式(已廢棄)。##$PROCESS_ID or $PID$<目前流程的實際使用者號碼$REAL_USER_ID或 $UID$>目前行程的有效使用者號碼$EFFECTIVE_USER_ID or $EUID$(目前程序的實際群組使用者號碼#$REAL_GROUP_ID or $GID#$)目前進程的有效群組使用者號碼$EFFECTIVE_GROUP_ID or $EGID#$包含正在執行的腳本的檔案名稱$PROGRAM_NAME$[陣列的陣列第一個元素的下標,預設是0。 $]Perl的版本號碼$PERL_VERSION$^D調試標誌的值$DEBUGGING#$^E在非UNIX環境中的作業系統擴充錯誤訊息#$EXTENDED_OS_ERROR$^ F最大的檔案捆述符數值$SYSTEM_FD_MAX$^H由編譯器啟動的語法檢查狀態#$^I內建控制編輯器的值$INPLACE_EDIT$^M備用記憶體池的大小##$^T從新世紀開始算起,腳步本以秒計算的開始運行的時間$BASETIME$^W警告開關的目前值$WARNING#$^XPerl二進位執行碼的名稱$EXECUTABLE_NAME$ARGV從預設的檔案句柄讀取時的目前檔名
$_預設輸入和模式匹配內容。
$ARG
$.前一次讀的檔案句柄的目前行號
$NR
$/輸入記錄分隔符號,預設是新行字元。如用undef這個變數,將會讀到文件結尾。
$RS
$,#輸出域分隔符號
$OFS
$\輸出記錄分隔符號
$ORS
$"此變數同$,類似,但應用於雙引號所引起的字串(或類似的內插字串)中內插數組和切片值的場合。預設為一個空格。 "。
$SUBSCRIPT_SEPARATOR
#$^L傳送到輸出通道的走紙換頁符。預設為"\f".
$FORMAT_FORMFEED
$:The current set of characters after which a string may be broken to fill continuation fields (starting with ^) in a format. Default is "\n"".
$FORMAT_LINE_BREAK_CHARACTERS
$^ A列印前用於儲存格式化資料的變數
$ACCUMULATOR
$OFMT
$?#返回上一個外部指令的狀態
#$CHILD_ERROR
$!這個變數的數字值是errno的值,字串值是對應的系統錯誤字串
$OS_ERROR or $ERRNO
$@指令eval的錯誤訊息.如果為空,則表示上一次eval指令執行成功
$EVAL_ERROR
$$執行目前Perl腳本程式的行程編號


$^O作業系統名稱
#$OSNAME
$^P指定目前偵錯值的內部變數
$PERLDB

#全域數組特殊變數

##@ARGV@INC@F全域雜湊特殊變數
傳給腳本的命令列參數清單
在匯入模組時需要搜尋的目錄清單
命令列的陣列輸入

%INC%ENV#%SIG

全域特殊檔案句柄

散列表%INC包含所有用do或require語句包含的檔案.關鍵字是檔案名稱,值是這個檔案的路徑

包含目前環境變數

##訊號清單及其處理方式

標準輸入句柄#標準輸出句柄##DATA _ (底線)全域特殊常數

ARGV

#遍歷陣列變數@ARGV中的所有檔案名稱的特殊檔案句柄

STDERR

標準錯誤輸出句柄
##STDIN

STDOUT

特殊文件句柄引用了在文件中__END__ 標誌後的任何內容包含腳本內容。或引用一個包含文件中__DATA__ 標誌後的所有內容,只要你在同一個包有讀取數據,__DATA__ 就存在。

特殊的檔案句柄用於快取檔案資訊(fstat、stat和lstat)。

#__END____FILE____LINE____PACKAGE__正規表示式特殊變數

腳本的邏輯結束,忽略後面的文字。

目前檔案名稱

目前行號

#目前包名,預設的包名是main。

$n$&#$MATCH$`$PREMATCH#$'$POSTMATCH$+與上個正規表示式搜尋格式相符的最後一個括號。例如:
/Version: (.*)|Revision: (.*)/ && ($rev = $+);

包含上次模式匹配的第n個子字串

前一次成功模式匹配的字串

前次符合成功的子字串之前的內容

##前次符合成功的子字串之後的內容

############$LAST_PAREN_MATCH##############

檔案句柄特殊變數

目前每頁長度。預設為 60。 目前頁剩餘的行數目前報表輸出格式的名稱。預設值是檔案句柄名。 目前報表輸出表頭格式的名稱。預設值是帶有後綴"_TOP"的檔案句柄名。

$|

#如果設定為零,每次呼叫函數write或print後,自動呼叫函數fflush,將所寫內容寫回檔案

#$OUTPUT_AUTOFLUSH

#$%

目前輸出頁號

$FORMAT_PAGE_NUMBER

##$=

$FORMAT_LINES_PER_PAGE

$-

$FORMAT_LINES_LEFT

$~

$FORMAT_NAME

#$^

$FORMAT_TOP_NAME

#