Perl 特殊變數

Perl 特殊變數

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

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

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

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

例項

#!/usr/bin/perl foreach ('Google','itread01','Taobao') { print $_; print "\n"; }

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

Google
itread01
Taobao

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

例項

#!/usr/bin/perl foreach ('Google','itread01','Taobao') { print; print "\n"; }

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

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