Perl - 特殊變數



在 Perl 中,有一些變數具有預定義的特殊含義。它們是在通常的變數指示符($, @ 或 %)之後使用標點符號的變數,例如 $_(如下所述)。

大多數特殊變數都有一個類似英文的長名稱,例如,作業系統錯誤變數 $! 可以寫成 $OS_ERROR。但是,如果您要使用類似英文的名稱,則需要在程式檔案頂部新增一行 use English;。這將指導直譯器獲取變數的確切含義。

最常用的特殊變數是 $_,它包含預設的輸入和模式搜尋字串。例如,在以下幾行中:

#!/usr/bin/perl

foreach ('hickory','dickory','doc') {
   print $_;
   print "\n";
}

執行後,將產生以下結果:

hickory
dickory
doc

再次,讓我們檢查不顯式使用 $_ 變數的相同示例:

#!/usr/bin/perl

foreach ('hickory','dickory','doc') {
   print;
   print "\n";
}

執行後,也將產生以下結果:

hickory
dickory
doc

第一次執行迴圈時,列印“hickory”。第二次列印“dickory”,第三次列印“doc”。這是因為在迴圈的每次迭代中,當前字串都放置在 $_ 中,並被 print 預設使用。以下是 Perl 即使您未指定也會假設 $_ 的位置:

  • 各種一元函式,包括諸如 ord 和 int 之類的函式,以及所有檔案測試(-f,-d),除了 -t,它預設為 STDIN。

  • 各種列表函式,如 print 和 unlink。

  • 模式匹配操作 m//、s/// 和 tr///,當不用於 =~ 運算子時。

  • 如果未提供其他變數,則在 foreach 迴圈中的預設迭代器變數。

  • grep 和 map 函式中的隱式迭代器變數。

  • 當行輸入操作的結果本身作為 while 測試的唯一條件進行測試時(即,),將輸入記錄放置的預設位置。請注意,在 while 測試之外,不會發生這種情況。

特殊變數型別

根據特殊變數的使用和性質,我們可以將其分為以下幾類:

  • 全域性標量特殊變數。
  • 全域性陣列特殊變數。
  • 全域性雜湊特殊變數。
  • 全域性特殊檔案控制代碼。
  • 全域性特殊常量。
  • 正則表示式特殊變數。
  • 檔案控制代碼特殊變數。

全域性標量特殊變數

以下是所有標量特殊變數的列表。我們列出了相應的類似英文的名稱以及符號名稱。

$_ 預設的輸入和模式搜尋空間。
$ARG
$. 最後一個讀取的檔案控制代碼的當前輸入行號。對檔案控制代碼的顯式關閉將重置行號。
$NR
$/ 輸入記錄分隔符;預設為換行符。如果設定為空字串,則將空行視為分隔符。
$RS
$, print 運算子的輸出欄位分隔符。
$OFS
$\ print 運算子的輸出記錄分隔符。
$ORS
$" 類似於 "$,",但它適用於插入到雙引號字串(或類似的解釋字串)中的列表值。預設為空格。
$LIST_SEPARATOR
$; 多維陣列模擬的下標分隔符。預設為 "\034"。
$SUBSCRIPT_SEPARATOR
$^L 格式輸出以執行換頁的字元。預設為 "\f"。
$FORMAT_FORMFEED
$: 當前字元集,在這些字元之後可以中斷字串以填充格式中延續欄位(以 ^ 開頭)。預設為 "\n""。
$FORMAT_LINE_BREAK_CHARACTERS
$^A 格式行的寫入累加器的當前值。
$ACCUMULATOR
$# 包含列印數字的輸出格式(已棄用)。
$OFMT
$? 最後一個管道關閉、反引號(``)命令或系統運算子返回的狀態。
$CHILD_ERROR
$! 如果在數字上下文中使用,則產生 errno 變數的當前值,標識最後一個系統呼叫錯誤。如果在字串上下文中使用,則產生相應的系統錯誤字串。
$OS_ERROR 或 $ERRNO
$@ 最後一個 eval 命令的 Perl 語法錯誤訊息。
$EVAL_ERROR
$$ 執行此指令碼的 Perl 程序的 pid。
$PROCESS_ID 或 $PID
$< 此程序的真實使用者 ID (uid)。
$REAL_USER_ID 或 $UID
$> 此程序的有效使用者 ID。
$EFFECTIVE_USER_ID 或 $EUID
$( 此程序的真實組 ID (gid)。
$REAL_GROUP_ID 或 $GID
$) 此程序的有效 gid。
$EFFECTIVE_GROUP_ID 或 $EGID
$0 包含正在執行的 Perl 指令碼的檔名。
$PROGRAM_NAME
$[ 陣列中第一個元素和子字串中第一個字元的索引。預設為 0。
$] 返回版本加上補丁級別除以 1000。
$PERL_VERSION
$^D 除錯標誌的當前值。
$DEBUGGING
$^E 某些平臺上的擴充套件錯誤訊息。
$EXTENDED_OS_ERROR
$^F 最大系統檔案描述符,通常為 2。
$SYSTEM_FD_MAX
$^H 包含某些實用模組啟用的內部編譯器提示。
$^I 就地編輯擴充套件的當前值。使用 undef 停用就地編輯。
$INPLACE_EDIT
$^M 如果 Perl 因記憶體不足錯誤而死亡,則 $M 的內容可用作緊急記憶體池。使用 $M 需要對 Perl 進行特殊編譯。有關更多資訊,請參閱 INSTALL 文件。
$^O 包含當前 Perl 二進位制檔案編譯的 операционная система 名稱。
$OSNAME
$^P 偵錯程式清除的內部標誌,以便它不除錯自身。
$PERLDB
$^T 指令碼開始執行的時間,以自紀元以來的秒數表示。
$BASETIME
$^W 警告開關的當前值,為真或假。
$WARNING
$^X Perl 二進位制檔案本身執行的名稱。
$EXECUTABLE_NAME
$ARGV 從 <ARGV> 讀取時包含當前檔名。

全域性陣列特殊變數

@ARGV 包含用於指令碼的命令列引數的陣列。
@INC 包含要由 do、require 或 use 構造評估的 Perl 指令碼查詢位置的列表的陣列。
@F 當給出 -a 命令列開關時,輸入行將被拆分到的陣列。

全域性雜湊特殊變數

%INC 包含透過 do 或 require 包含的每個檔案的名稱的條目。
%ENV 包含您當前環境的雜湊。
%SIG 用於為各種訊號設定訊號處理程式的雜湊。

全域性特殊檔案控制代碼

ARGV 迭代 @ARGV 中命令列檔名的特殊檔案控制代碼。通常在 <> 中寫成空檔案控制代碼。
STDERR 任何包中的標準錯誤的特殊檔案控制代碼。
STDIN 任何包中的標準輸入的特殊檔案控制代碼。
STDOUT 任何包中的標準輸出的特殊檔案控制代碼。
DATA 引用包含指令碼的檔案中 __END__ 令牌之後的任何內容的特殊檔案控制代碼。或者,對於所需檔案中 __DATA__ 令牌之後的任何內容的特殊檔案控制代碼,只要您在找到 __DATA__ 的同一包中讀取資料即可。
_(下劃線) 用於快取來自最後一個 stat、lstat 或檔案測試運算子的資訊的特殊檔案控制代碼。

全域性特殊常量

__END__ 指示程式的邏輯結束。任何後續文字都將被忽略,但可以透過 DATA 檔案控制代碼讀取。
__FILE__ 表示程式中使用它的位置的檔名。不會插入到字串中。
__LINE__ 表示當前行號。不會插入到字串中。
__PACKAGE__ 表示編譯時的當前包名稱,如果不存在當前包,則為未定義。不會插入到字串中。

正則表示式特殊變數

$digit 包含上次匹配的模式中相應括號集匹配的文字。例如,$1 匹配先前正則表示式中第一組括號中包含的內容。
$& 上次成功模式匹配匹配的字串。
$MATCH
$` 上次成功模式匹配之前匹配的字串。
$PREMATCH
$' 上次成功模式匹配之後匹配的字串。
$POSTMATCH
$+ 上次搜尋模式匹配的最後一個括號。如果您不知道匹配了一組備選模式中的哪一個,這將很有用。例如:/Version: (.*)|Revision: (.*)/ && ($rev = $+);

$LAST_PAREN_MATCH

檔案控制代碼特殊變數

$| 如果設定為非零,則在當前選定的輸出通道上的每次寫入或列印後強制執行 fflush(3)。
$OUTPUT_AUTOFLUSH
$% 當前選定輸出通道的當前頁碼。
$FORMAT_PAGE_NUMBER
$= 當前選定輸出通道的當前頁長(可列印行)。預設為 60。
$FORMAT_LINES_PER_PAGE
$- 當前選定輸出通道的頁面上剩餘的行數。
$FORMAT_LINES_LEFT
$~ 當前選定輸出通道的當前報表格式的名稱。預設為檔案控制代碼的名稱。
$FORMAT_NAME
$^ 當前選定輸出通道的當前頁首格式的名稱。預設為檔案控制代碼名稱後附加 _TOP。
$FORMAT_TOP_NAME
廣告