Perl 特殊變數
Perl 特殊變數
Perl 語言中定義了一些特殊的變數,通常以 $, @, 或 % 作為字首,例如:$_。
很多特殊的變數有一個很長的英文名,作業系統變數 $! 可以寫為 $OS_ERROR。
如果你想使用英文名的特殊變數需要在程式頭部新增 use English;。這樣就可以使用具有描述性的英文特殊變數。
最常用的特殊變數為 $_,該變數包含了預設輸入和模式匹配內容。例項如下:
例項
執行以上程式,輸出結果為:
Google itread01 Taobao
以下例項我們不使用 $_ 來輸出內容:
例項
執行以上程式,輸出結果為:
Google itread01 Taobao
例項中,首先輸出 "Google" ,接著輸出 "itread01" ,最後輸出 "Taobao" 。
在迭代迴圈中,當前迴圈的字串會放在 $_ 中, 然後 通過 print 輸出。另外 print 在不指定輸出變數,預設情況下使用的也是 $_。
以下是幾處即使沒有寫明 Perl 也會假定使用 $_ 的地方:
- 各種單目函式,包括像 ord() 和 int() 這樣的函式以及除 "-t"以外所有的檔案 測試操作 ("-f","-d"),"-t" 預設操作 STDIN。
- 各種列表函式,例如 print() 和 unlink()。
- 沒有使用 "=~" 運算子時的模式匹配操作 "m//"、"s///" 和"tr///"。
- 在沒有給出其他變數時是 "foreach" 迴圈的預設迭代變數。
- grep() 和 map() 函式的隱含迭代變數。
- 當 "while" 僅有唯一條件,且該條件是對 ""操作的結果進行測試時,$_ 就是存放輸入記錄的預設位置。除了"while" 測試條件之外不會發生這種情況。(助記:下劃線在特定操作中是可以省略的。)
特殊變數型別
根據特殊的變數的使用性質,可以分為以下幾類:
全域性標量特殊變數。
全域性陣列特殊變數。
全域性雜湊特殊變數。
全域性特殊檔案控制代碼。
全域性特殊常量。
正則表示式特殊變數。
檔案控制代碼特殊變數。
全域性標量特殊變數
以下列出了所有的標量特殊變數,包含了特殊字元與英文形式的變數:
$_ | 預設輸入和模式匹配內容。 |
$ARG | |
$. | 前一次讀的檔案控制代碼的當前行號 |
$NR | |
$/ | 輸入記錄分隔符,預設是新行字元。如用undef這個變數,將讀到檔案結尾。 |
$RS | |
$, | 輸出域分隔符 |
$OFS | |
$\ | 輸出記錄分隔符 |
$ORS | |
$" | 該變數同 $,類似,但應用於向雙引號引起的字串(或類似的內插字串)中內插陣列和切片值的場合。預設為一個空格。 |
$LIST_SEPARATOR | |
$; | 在模擬多維陣列時使用的分隔符。預設為 "\034"。 |
$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指令碼程式的程序號 |
$PROCESS_ID or $PID | |
$< | 當前程序的實際使用者號 |
$REAL_USER_ID or $UID | |
$> | 當前程序的有效使用者號 |
$EFFECTIVE_USER_ID or $EUID | |
$( | 當前程序的實際組使用者號 |
$REAL_GROUP_ID or $GID | |
$) | 當前程序的有效組使用者號 |
$EFFECTIVE_GROUP_ID or $EGID | |
$0 | 包含正在執行的指令碼的檔名 |
$PROGRAM_NAME | |
$[ | 陣列的陣列第一個元素的下標,預設是 0。 |
$] | Perl的版本號 |
$PERL_VERSION | |
$^D | 除錯標誌的值 |
$DEBUGGING | |
$^E | 在非UNIX環境中的作業系統擴充套件錯誤資訊 |
$EXTENDED_OS_ERROR | |
$^F | 最大的檔案捆述符數值 |
$SYSTEM_FD_MAX | |
$^H | 由編譯器啟用的語法檢查狀態 |
$^I | 內建控制編輯器的值 |
$INPLACE_EDIT | |
$^M | 備用記憶體池的大小 |
$^O | 作業系統名 |
$OSNAME | |
$^P | 指定當前除錯值的內部變數 |
$PERLDB | |
$^T | 從新世紀開始算起,腳步本以秒計算的開始執行的時間 |
$BASETIME | |
$^W | 警告開關的當前值 |
$WARNING | |
$^X | Perl二進位制可執行程式碼的名字 |
$EXECUTABLE_NAME | |
$ARGV | 從預設的檔案控制代碼中讀取時的當前檔名 |
全域性陣列特殊變數
@ARGV | 傳給指令碼的命令列引數列表 |
@INC | 在匯入模組時需要搜尋的目錄列表 |
@F | 命令列的陣列輸入 |
全域性雜湊特殊變數
%INC |
散列表%INC包含所有用do或require語句包含的檔案.關鍵字是檔名,值是這個檔案的路徑 |
%ENV |
包含當前環境變數 |
%SIG |
訊號列表及其處理方式 |
全域性特殊檔案控制代碼
ARGV |
遍歷陣列變數@ARGV中的所有檔名的特殊檔案控制代碼 |
STDERR |
標準錯誤輸出控制代碼 |
STDIN |
標準輸入控制代碼 |
STDOUT |
標準輸出控制代碼 |
DATA |
特殊檔案控制代碼引用了在檔案中 __END__ 標誌後的任何內容包含指令碼內容。或者引用一個包含檔案中__DATA__ 標誌後的所有內容,只要你在同一個包有讀取資料,__DATA__ 就存在。 |
_ (下劃線) |
特殊的檔案控制代碼用於快取檔案資訊(fstat、stat和lstat)。 |
全域性特殊常量
__END__ |
指令碼的邏輯結束,忽略後面的文字。 |
__FILE__ |
當前檔名 |
__LINE__ |
當前行號 |
__PACKAGE__ |
當前包名,預設的包名是main。 |
正則表示式特殊變數
$n |
包含上次模式匹配的第n個子串 |
$& |
前一次成功模式匹配的字串 |
$MATCH |
|
$` |
前次匹配成功的子串之前的內容 |
$PREMATCH |
|
$' |
前次匹配成功的子串之後的內容 |
$POSTMATCH |
|
$+ |
與上個正則表示式搜尋格式匹配的最後一個括號。例如: /Version: (.*)|Revision: (.*)/ && ($rev = $+); |
$LAST_PAREN_MATCH |
檔案控制代碼特殊變數
$| |
如果設定為零,在每次呼叫函式write或print後,自動呼叫函式fflush,將所寫內容寫回檔案 |
$OUTPUT_AUTOFLUSH |
|
$% |
當前輸出頁號 |
$FORMAT_PAGE_NUMBER |
|
$= |
當前每頁長度。預設為 60。 |
$FORMAT_LINES_PER_PAGE |
|
$- |
當前頁剩餘的行數 |
$FORMAT_LINES_LEFT |
|
$~ |
當前報表輸出格式的名稱。預設值是檔案控制代碼名。 |
$FORMAT_NAME |
|
$^ |
當前報表輸出表頭格式的名稱。預設值是帶字尾"_TOP"的檔案控制代碼名。 |
$FORMAT_TOP_NAME |