內容

名稱

perlvar - Perl 預定義變數

描述

變數名稱的語法

在 Perl 中,變數名稱可以有多種格式。通常,它們必須以字母或底線開頭,此時它們可以是任意長度(最多內部限制為 251 個字符)並且可以包含字母、數字、底線或特殊序列 ::'。在這種情況下,最後一個 ::' 之前的部分被視為 套件限定符;參見 perlmod。非 ASCII 的 Unicode 字母除非啟用了 "use utf8",否則不被視為字母,並且適用於稍微複雜的規則;詳細信息請參見 perldata 中的 "Identifier parsing"

Perl 變數名稱也可以是一系列數字、單個標點符號或兩個字符序列:^(插入符號或插入式重音符號)後跟任何一個字符 [][A-Z^_?\]。這些名稱都被 Perl 保留用於特殊用途;例如,所有數字名稱用於在正則表達式匹配後保存捕獲的數據。

自 Perl v5.6.0 起,Perl 變數名稱也可以是由插入符號(caret)開頭的字母數字字串。所有這些變數都必須使用花括號來寫,例如 ${^Foo};花括號是可選的。例如,${^Foo} 表示的是變數名稱被視為一個控制-F後跟兩個o的純量變數。(詳情請參見"使用花括號劃分的變數名稱" 在 perldata 中的說明)。這些變數被保留供 Perl 未來特殊用途使用,但不包括以 ^_ (插入符號-底線)開頭的變數。任何以 ^_ 開頭的名稱都不會在 Perl 的任何未來版本中獲得特殊意義;因此,這些名稱可以在程式中安全使用。不過,$^_ 本身是保留的。

請注意,在內插時,您也必須使用劃分形式來訪問這種類型變數的下標。例如,在雙引號字符串中訪問@{^CAPTURE} 變數的第一個元素,您應該寫成 "${^CAPTURE[0]}",而不是 "${^CAPTURE}[0]",後者將意味著引用一個名為${^CAPTURE}的純量變數,而不是索引為0的由正則引擎填充的神奇@{^CAPTURE}陣列。

以數字或標點符號開頭的 Perl 標識符不受package聲明的影響,始終強制位於main套件中;它們也不受strict 'vars'錯誤的影響。其他一些名稱也以這些方式豁免。

ENV      STDIN
INC      STDOUT
ARGV     STDERR
ARGVOUT
SIG

特別是,特殊的${^_XYZ}變數始終被視為位於main套件中,而不論當前範圍中存在的package聲明。

特殊變數

以下名稱對 Perl 具有特殊意義。大多數標點名稱都有合理的記憶方法,或者在 shell 中有類似的。儘管如此,如果您希望使用長變數名稱,您只需在程序頂部說明

use English;

這將把所有短名稱別名為當前套件中的長名稱。一些甚至有中等名稱,通常借用自awk。有關更多信息,請參見English

在繼續之前,請注意變數的排序方式。一般來說,我們首先按不區分大小寫的幾乎字典序排列變數(忽略單詞前的{^,如${^UNICODE}$^T),雖然$_@_會移到堆的頂部。對於具有相同標識符的變數,我們按照純量、陣列、雜湊和裸字的順序列出它。

一般變數

$ARG
$_

預設輸入和模式搜索空間。以下對等的對組

while (<>) {...}    # equivalent only in while!
while (defined($_ = <>)) {...}

/^Subject:/
$_ =~ /^Subject:/

tr/a-z/A-Z/
$_ =~ tr/a-z/A-Z/

chomp
chomp($_)

這些是 Perl 假設 $_ 的地方,即使您沒有使用它。

  • 以下函數使用 $_ 作為預設參數。

    abs、alarm、chomp、chop、chr、chroot、cos、defined、eval、evalbytes、exp、fc、glob、hex、int、lc、lcfirst、length、log、lstat、mkdir、oct、ord、pos、print、printf、quotemeta、readlink、readpipe、ref、require、reverse(僅在純量上下文中)、rmdir、say、sin、split(對於其第二個參數)、sqrt、stat、study、uc、ucfirst、unlink、unpack。

  • 所有文件測試(-f-d)除了 -t,它的預設為 STDIN。請參閱 perlfunc 中的 "-X"

  • 當沒有使用 =~ 運算符時,模式匹配操作 m//s///tr///(又名 y///)。

  • 如果未提供其他變量,在 foreach 迴圈中的默認迭代變量。

  • grep()map() 函數中的隱式迭代變量。

  • given() 的隱式變量。

  • 當將 <FH>readlinereaddireach 操作的結果單獨作為 while 測試的唯一標準時,下一個值或輸入記錄的默認放置位置。在 while 測試之外,這不會發生。

$_ 是一個全局變量。

然而,在 perl v5.10.0 和 v5.24.0 之間,可以通過寫 my $_ 來將其在該作用域內做為局部變量使用。然後,可以使用 our $_ 使 $_ 參考相同作用域中的全局 $_。這個實驗性特性已被移除並且現在是一個致命錯誤,但您可能在舊代碼中遇到它。

記憶法:底線在某些操作中被理解。

@ARG
@_

在子程序中,陣列 @_ 包含傳遞給該子程序的參數。在子程序內部,@_ 是陣列運算符 popshift 的默認陣列。

請參閱 perlsub

$LIST_SEPARATOR
$"

當陣列或陣列切片被插入到雙引號字串或類似的上下文(如 /.../)中時,其元素由此值分隔。默認是一個空格。例如,這

print "The array is: @array\n";

等價於這個

print "The array is: " . join($", @array) . "\n";

記憶法:在雙引號上下文中起作用。

$PROCESS_ID
$PID
$$

執行此腳本的 Perl 程序號碼。雖然您可以設置此變量,但通常不鼓勵這樣做,儘管對於某些測試目的可能非常寶貴。它將在fork()調用之間自動重置。

Linux 和 Debian GNU/kFreeBSD 用戶注意:在 Perl v5.16.0 之前,perl 會使用 LinuxThreads 在 Linux 系統上模擬 POSIX 語義,LinuxThreads 是 POSIX 线程的部分實現,現已被 Native POSIX Thread Library (NPTL) 取代。

LinuxThreads 現在在 Linux 上已經過時,像這樣緩存getpid()會使嵌入 perl 變得不必要地複雜(因為您必須手動更新 $$ 的值),所以現在$$getppid()將始終返回與底層 C 函數庫相同的值。

Debian GNU/kFreeBSD 系統也使用了 LinuxThreads,直到 6.0 版本,但在那之後轉移到了類似 POSIX 的 FreeBSD 线程語義。

要查看您的系統是否受到此不一致性的影響,請檢查getconf GNU_LIBPTHREAD_VERSION | grep -q NPTL是否返回錯誤值。NTPL 线程保留了 POSIX 語義。

記憶法:與 shells 相同。

$PROGRAM_NAME
$0

包含正在執行的程序的名稱。

在某些(但不是全部)操作系統上,將$0賦值會修改ps程序看到的參數區域。在某些平台上,您可能需要使用特殊的ps選項或不同的ps來查看更改。修改$0更有用作為指示當前程序狀態的一種方式,而不是用於隱藏正在運行的程序。

請注意,$0的最大長度存在特定於平台的限制。在最極端的情況下,它可能受到原始$0所占空間的限制。

在某些平台上,修改名稱後顯示的ps中可能存在任意數量的填充,例如空格字符。在某些平台上,無論您做什麼(例如,在 Linux 2.2 中),此填充可能會一直延伸到原始參數區域的原始長度。

BSD 用戶請注意:設置$0並不完全從 ps(1) 輸出中刪除“perl”。例如,將$0設置為"foobar"可能會導致"perl: foobar (perl)"(是否顯示"perl: "前綴和“(perl)”後綴取決於您的確切 BSD 變體和版本)。這是一個操作系統功能,Perl 無法解決。

在多線程腳本中,Perl 協調線程,以便任何線程都可以修改其$0的副本,並且變更對 ps(1) 可見(假設操作系統配合)。請注意,其他線程擁有的$0視圖不會更改,因為它們有自己的副本。

如果程序是通過選項-e-E給 perl 的,$0將包含字符串"-e"

在 Linux 中,從 perl v5.14.0 開始,將使用prctl(2)設置傳統進程名稱,除了通過argv[0]修改 POSIX 名稱,就像 perl 自版本 4.000 起做的那樣。現在系統工具(如 ps、top 和 killall)將識別您設置$0時所設置的名稱。您提供的字符串將被截斷為 16 個字節,這是 Linux 強加的限制。

寬字元在 $0 值中是無效的。然而,出於歷史原因,Perl 會接受這些寬字元並將它們編碼為 UTF-8。當發生這種情況時,將觸發寬字元警告。

助記符:與 shksh 相同。

$REAL_GROUP_ID
$GID
$(

此進程的實際 gid。如果您在一台支持同時屬於多個組的機器上,則會給出您所屬組的以空格分隔的列表。第一個數字是由 getgid() 返回的數字,後續的數字是由 getgroups() 返回的,其中可能有一個與第一個數字相同。

然而,分配給 $( 的值必須是用於設置實際 gid 的單個數字。因此,$( 給出的值在未經強制轉換為數值的情況下不應重新分配給 $(,例如通過添加零。請注意,這與有效 gid ($)) 不同,後者可以接受列表。

您可以使用 POSIX::setgid() 同時更改實際 gid 和有效 gid。對於 $( 的更改需要檢查 $! 以檢測任何可能的錯誤。

助記符:括號用於對事物進行分組。實際 gid 是您離開的組,如果您正在運行 setgid。

$EFFECTIVE_GROUP_ID
$EGID
$)

此進程的有效 gid。如果您在一台支持同時屬於多個組的機器上,則會給出您所屬組的以空格分隔的列表。第一個數字是由 getegid() 返回的數字,後續的數字是由 getgroups() 返回的,其中可能有一個與第一個數字相同。

同樣,分配給 $) 的值也必須是以空格分隔的數字列表。第一個數字設置有效 gid,其餘(如果有)將傳遞給 setgroups()。為了獲得對於 setgroups() 的空列表的效果,只需重複新的有效 gid;也就是說,要強制有效 gid 為 5 並且有效地空的 setgroups() 列表,可以說 $) = "5 5"

您可以使用 POSIX::setgid()(僅使用單個數字參數)同時更改有效 gid 和實際 gid。對於 $) 的更改需要檢查 $! 以檢測任何可能的錯誤。

$<$>$($) 只能在支持相應的set[re][ug]id()例程的機器上設置。只有支持 setregid() 的機器才能交換 $($)

助記符:括號用於對事物進行分組。有效 gid 是對您來說正確的組,如果您正在運行 setgid。

$REAL_USER_ID
$UID
$<

此進程的實際 uid。您可以使用 POSIX::setuid() 同時更改實際 uid 和有效 uid。由於對 $< 的更改需要系統調用,因此請在更改嘗試後檢查 $! 以檢測任何可能的錯誤。

助記符:這是您來自的 uid,如果您正在運行 setuid。

$EFFECTIVE_USER_ID
$EUID
$>

此處程式的有效使用者 ID。例如

$< = $>;            # set real to effective uid
($<,$>) = ($>,$<);  # swap real and effective uids

您可以使用 POSIX::setuid() 同時更改有效使用者 ID 和實際使用者 ID。對 $> 的更改需要檢查 $!,以檢測在嘗試更改後是否存在任何可能的錯誤。

$<$> 只能在支援 setreuid() 的機器上互換。

助記符:如果您正在運行 setuid,則它是您轉到的使用者 ID。

$SUBSCRIPT_SEPARATOR
$SUBSEP
$;

用於多維數組模擬的下標分隔符。如果您將哈希元素引用為

$foo{$x,$y,$z}

它實際上意味著

$foo{join($;, $x, $y, $z)}

但不要放

@foo{$x,$y,$z}     # a slice--note the @

這意味著

($foo{$x},$foo{$y},$foo{$z})

默認值為 "\034",與 awk 中的 SUBSEP 相同。如果您的鍵包含二進制數據,則可能沒有任何安全的值可用於 $;

請考慮使用如 perllol 中描述的 "真正" 多維數組。

助記符:逗號(語法下標分隔符)是一個半分號。

$a
$b

在使用 sort() 時的特殊套件變數,參見 perlfunc 中的 "sort"。由於這種特殊性,即使在使用 strict 'vars' 指示詞時,使用 use varsour(),也不需要聲明 $a$b。如果您想要在 sort() 比較區塊或函數中使用它們,不要使用 my $amy $b 來使它們成為詞法變數。

%ENV

哈希 %ENV 包含當前的環境。在 fork() 出子進程後,設置 ENV 中的值會更改後續任何子進程的環境。

從 v5.18.0 開始,存儲在 %ENV 中的鍵和值都會被串列化。

my $foo = 1;
$ENV{'bar'} = \$foo;
if( ref $ENV{'bar'} ) {
    say "Pre 5.18.0 Behaviour";
} else {
    say "Post 5.18.0 Behaviour";
}

以前,僅子進程接收串列化值

my $foo = 1;
$ENV{'bar'} = \$foo;

# Always printed 'non ref'
system($^X, '-e',
       q/print ( ref $ENV{'bar'}  ? 'ref' : 'non ref' ) /);

這是因為您無法真正與外部進程共享任意數據結構。

$OLD_PERL_VERSION
$]

Perl 解釋器的修訂版、版本和子版本,表示為 5.XXXYYY 的十進制形式,其中 XXX 是版本 / 1e3,YYY 是子版本 / 1e6。例如,Perl v5.10.1 將是 "5.010001"。

此變數可用於確定執行腳本的 Perl 解釋器是否在正確的版本範圍內

warn "No PerlIO!\n" if "$]" < 5.008;

在比較 $] 時,應使用數值比較運算符,但應首先將變量串列化,以避免其原始數值不準確的問題。

參見 use VERSIONrequire VERSION 的文檔,以獲取一種方便的方式,如果運行 Perl 解釋器的版本太舊則失敗。

參見 "$^V" 以獲取 Perl 版本的表示形式,它作為一個 version 對象,允許進行更靈活的字符串比較。

在Perl的任何版本上,$]相对于$^V的主要优势是它的功能相同。缺点是它不容易与其他格式的版本进行比较(例如文字形式的v-strings,"v1.2.3"或版本对象),并且数字比较受到二进制浮点表示的影响;它适用于数字字面版本检查,但不适用于与未经过合理检查的变量进行比较。

$OLD_PERL_VERSION形式是从Perl v5.20.0开始出现的,出于历史原因,但不建议使用。(如果您使用$]的原因是在旧的Perl上运行代码,那么将其称为$OLD_PERL_VERSION将是适得其反的。)

助记符:这个perl版本是在正确的括号内吗?

$SYSTEM_FD_MAX
$^F

最大的系统文件描述符,通常为2。系统文件描述符被传递给exec()的进程,而更高的文件描述符则不会。此外,在open()期间,即使open()失败,系统文件描述符也会被保留(普通文件描述符在尝试open()之前关闭)。文件描述符的关闭-on-exec状态将根据打开相应文件、管道或套接字时$^F的值决定,而不是exec()的时间。

@F

当自动分割模式开启时,数组@F包含每行读入的字段。请参阅perlrun中的-a开关。此数组是特定于包的,如果在运行时不在主包中运行strict 'vars',则必须声明或给出完整的包名称。

@INC

数组@INC包含do EXPRrequireuse构造查找其库文件的位置列表。它最初由任何-I命令行开关的参数组成,后跟默认的Perl库,可能是/usr/local/lib/perl。在Perl 5.26之前,. - 表示当前目录,包含在@INC中;已经移除了这种行为变化。此行为变化已记录在PERL_USE_UNSAFE_INC中,并且不建议重新将.添加到@INC。如果需要在运行时修改@INC,应该使用use lib编译指示将机器相关的库正确加载。

use lib '/mypath/libdir/';
use SomeMod;

您还可以通过直接将Perl代码放入@INC中,在文件包含系统中插入钩子。这些钩子可以是子例程引用、数组引用或祝福对象。有关详细信息,请参阅perlfunc中的"require"

%INC

哈希 %INC 包含每个通过 dorequireuse 操作符包含的文件的条目。键是您指定的文件名(将模块名转换为路径名),值是找到的文件位置。 require 操作符使用此哈希来确定特定文件是否已经被包含。

如果文件是通过挂钩加载的(例如,子例程引用,请参阅perlfunc 中的 "require" 以了解这些挂钩的描述),则默认情况下,此挂钩将被插入到 %INC 中,而不是文件名。 但是,请注意,该挂钩可能已经自己设置了 %INC 条目,以提供一些更具体的信息。

$INC

从5.37.7开始,当执行一个 @INC 挂钩时,将把保存挂钩的 @INC 数组的索引本地化到 $INC 变量中。 当挂钩返回时,将使用其值的整数后继者来确定下一个将被检查的 @INC 中的索引,因此,如果将其设置为 -1(或 undef),则将重新从开始遍历 @INC 数组。

通常,通过 @INC 数组的遍历是从头到尾的(0 .. $#INC),如果挂钩修改了 @INC 数组,则迭代器可能处于一种状态,新添加的条目将被跳过。 更改此值允许 @INC 挂钩重写 @INC 数组,并告诉 Perl 在之后继续。 有关 @INC 挂钩的详细信息,请参见perlfunc 中的 "require"

$INPLACE_EDIT
$^I

就地编辑扩展的当前值。 使用 undef 来禁用就地编辑。

助记符: -i 开关的值。

@ISA

每个包含一个特殊数组,称为 @ISA,其中包含该类的父类(如果有)。 此数组只是一列标量,每个标量都是对应于包名称的字符串。 在 Perl 进行方法解析时会检查该数组,有关方法解析,请参见 perlobj

要加载包并将其添加到 @ISA 中,请参见 parent 模块。 不推荐使用的 base 模块也可以这样做,但除了在需要与不推荐使用的 fields 模块兼容时,不应使用它。

$^M

默认情况下,内存耗尽是无法捕获的致命错误。 但是,如果 Perl 适当构建,可以在 die() 后使用 $^M 的内容作为紧急内存池。 假设您的 Perl 使用了 -DPERL_EMERGENCY_SBRK 编译,并且使用了 Perl 的 malloc。 那么

$^M = 'a' x (1 << 16);

在緊急情況下會配置一個 64K 的緩衝區以供使用。有關在編譯 perl 時如何添加自定義 C 編譯標誌的信息,請參閱 Perl 發行版中的 INSTALL 文件。為了阻止對這個高級功能的隨意使用,這個變量沒有英文的長名稱。

此變量於 Perl 5.004 中添加。

${^MAX_NESTED_EVAL_BEGIN_BLOCKS}

此變量決定允許的最大 eval EXPR/BEGINrequire/BEGIN 嵌套數量。這也意味著它同時控制著 use 語句的最大嵌套數量。

默認值為 1000,對於正常工作來說應該足夠大,如果必須提高它,則應該謹慎選擇,否則可能會因為 C 堆棧耗盡而引發段錯誤。實際上,真正的代碼應該不太可能具有超過 1000 的使用深度,但我們還是將其配置為可配置的,以防萬一。

當設置為 0 時,則完全禁止 eval EXPRrequire EXPR 內部的 BEGIN 塊,並觸發異常,將終止編譯,在 require 的情況下將引發異常,在 eval 的情況下像通常一樣返回錯誤信息至 $@

考慮下面的代碼

perl -le'sub f { eval "BEGIN { f() }"; } f()'

每次調用 f() 都會消耗大量的 C 堆棧,這個變量用於使這樣的代碼死掉,而不是耗盡 C 堆棧並觸發段錯誤。不用說,這樣的代碼很不尋常,你可能根本不需要提高這個設置。然而,對於防止 eval EXPR 中的 BEGIN{} 塊在有限的時間內被執行可能將其設置為 0 是有用的。

請注意,將此設置為 1 將不會影響像這樣的代碼

BEGIN { $n += 1; BEGIN { $n += 2; BEGIN { $n += 4 } } }

原因是 BEGIN 塊在完成後立即被執行,因此內部的 BEGIN 塊將在包含它的外部 BEGIN 塊甚至完成編譯之前執行,深度不會超過 1。實際上,上面的代碼等效於

BEGIN { $n+=4 }
BEGIN { $n+=2 }
BEGIN { $n+=1 }

這使得顯而易見為什麼 ${^MAX_EVAL_BEGIN_DEPTH} 的值為 1 不會阻止這段代碼。

只有在 eval 或 require 中執行的 BEGIN 會受到影響。

$OSNAME
$^O

在構建此 Perl 副本的操作系統的名稱,在配置過程中確定。例如,請參閱 perlport 中的 "PLATFORMS"

該值與 $Config{'osname'} 相同。另請參閱 Config-V 命令行開關,在 perlrun 中有文檔記錄。

在 Windows 平台上,$^O 並不是很有用:因為它總是 MSWin32,它無法區分 95/98/ME/NT/2000/XP/CE/.NET。使用 Win32::GetOSName() 或 Win32::GetOSVersion()(請參閱 Win32perlport)來區分各個變體。

此變量於 Perl 5.003 中添加。

%SIG

哈希表 %SIG 包含信號的信號處理程序。例如

sub handler {   # 1st argument is signal name
    my($sig) = @_;
    print "Caught a SIG$sig--shutting down\n";
    close(LOG);
    exit(0);
}

$SIG{'INT'}  = \&handler;
$SIG{'QUIT'} = \&handler;
...
$SIG{'INT'}  = 'DEFAULT';   # restore default action
$SIG{'QUIT'} = 'IGNORE';    # ignore SIGQUIT

使用 'IGNORE' 的值通常會忽略訊號,除了 CHLD 訊號之外。有關這個特殊情況的更多資訊,請參閱 perlipc。使用空字串或 undef 作為值的效果與 'DEFAULT' 相同。

以下是一些其他範例

$SIG{"PIPE"} = "Plumber";   # assumes main::Plumber (not
                            # recommended)
$SIG{"PIPE"} = \&Plumber;   # just fine; assume current
                            # Plumber
$SIG{"PIPE"} = *Plumber;    # somewhat esoteric
$SIG{"PIPE"} = Plumber();   # oops, what did Plumber()
                            # return??

請務必不要將裸字作為訊號處理器的名稱,以免意外調用它。

使用不對應任何現有函式的字串或不包含代碼槽的 glob,等同於 'IGNORE',但在調用處理器時會發出警告(對於下面描述的內部鉤子不發出警告)。

如果您的系統有 sigaction() 函式,則將使用它來安裝訊號處理器。這意味著您可以獲得可靠的訊號處理。

從 Perl v5.8.0 開始,訊號的默認交付策略已從立即(也稱為「不安全」)更改為延遲,也稱為「安全訊號」。有關更多資訊,請參閱 perlipc

某些內部鉤子也可以使用 %SIG 散列來設置。當要打印警告訊息時,會調用由 $SIG{__WARN__} 指示的例程。警告訊息作為第一個參數傳遞。存在 __WARN__ 鉤子會導致將警告正常打印到 STDERR 被抑制。您可以使用這個功能將警告保存到變數中,或將警告轉換為致命錯誤,如下所示

local $SIG{__WARN__} = sub { die $_[0] };
eval $proggie;

由於 'IGNORE' 鉤子不受 __WARN__ 支持,其效果與使用 'DEFAULT' 相同。您可以使用空子程式來禁用警告

local $SIG{__WARN__} = sub {};

當要拋出致命異常時,會調用由 $SIG{__DIE__} 指示的例程。錯誤訊息作為第一個參數傳遞。當 __DIE__ 鉤子例程返回時,例外處理將繼續進行,就像在沒有鉤子存在時一樣,除非鉤子例程本身通過 goto &sub、循環退出或 die() 退出。在呼叫期間,會明確禁用 __DIE__ 處理程序,因此您可以從 __DIE__ 處理程序中死亡。對於 __WARN__ 也是如此。

即使在 eval() 內部,也會調用 $SIG{__DIE__} 鉤子。這本來不是打算這樣做的,但是一個實現失誤使這成為可能。這曾經被廢棄,因為它允許像在 $@ 中重寫待定的異常這樣的奇怪行為。計劃對此進行修正已被取消,因為用戶發現重寫待定的異常實際上是一個有用的功能,而不是一個錯誤。

$SIG{__DIE__} 不支持 'IGNORE';其效果與 'DEFAULT' 相同。

__DIE__/__WARN__ 處理程序在一個方面非常特殊:它們可能被調用來報告解析器找到的(可能的)錯誤。在這種情況下,解析器可能處於不一致的狀態,因此任何嘗試從此類處理程序中評估 Perl 代碼的操作可能會導致 segfault。這意味著來自解析 Perl 的警告或錯誤應該極度小心使用,如下所示

require Carp if defined $^S;
Carp::confess("Something wrong") if defined &Carp::confess;
die "Something wrong, but could not load Carp to give "
  . "backtrace...\n\t"
  . "To see backtrace try starting Perl with -MCarp switch";

除非是調用處理程序的解析器,否則這裡的第一行將加載 Carp 。如果 Carp 可用,第二行將打印回溯並終止程序。只有在 Carp 不可用時,才會執行第三行。

在異常處理程序中考慮 $^S 變量是錯誤的。目前實現的 $SIG{__DIE__} 會引發嚴重且難以追踪的錯誤。請避免使用它,改用 END{} 或 CORE::GLOBAL::die 覆蓋。

有關更多信息,請參見 perlfunc 中的 "die"perlfunc 中的 "warn"perlfunc 中的 "eval"warnings

%{^HOOK}

此哈希包含在調用各種難以或無法包裝的 perl 關鍵字時調用的代碼引用。該哈希的鍵以被挂鉤的關鍵字命名,後跟兩個下劃線,然後是階段詞彙;要么是 "before",要么是 "after"。

如果嘗試修改未記錄存在的鍵,或者嘗試將除代碼引用或 undef 之外的任何內容存儲到哈希中,Perl 將引發錯誤。如果希望使用對象來實現挂鉤,可以使用柯里化將對象嵌入匿名代碼引用中。

目前只有一個可以被挂鉤的關鍵字,即 require,但預計在未來版本中將有其他支持挂鉤的關鍵字。

require__before

${^HOOK}{require__before} 指示的程序在 require 執行之前調用,它會在檢查 %INC、查找 @INC、調用 INC 挂鉤或編譯任何代碼之前執行。它帶有一個參數,即被要求的項目的文件名(將包名轉換為路徑)。它可以更改此文件名以更改要加載的文件。如果挂鉤在執行期間終止,則將阻止執行 require。

為了在執行 require 關鍵字之前和之後輕鬆地執行具有共享狀態的動作,require__before 鉤子可以返回一個「後動作」的代碼引用,當 require 完成時將被執行。無論 require 是否成功完成或拋出異常,此代碼引用都將被執行。它將使用所需的文件名進行調用。您可以檢查 %INC 以確定 require 是否成功。從 require__before 鉤子返回的任何其他內容將被默默忽略。

require__before 鉤子按照先進先出 (FIFO) 的順序進行調用,如果鉤子返回一個代碼引用,則這些代碼引用將按照後進先出 (FILO) 的順序進行調用。換句話說,如果 A 需要 B 需要 C,則 require__before 將首先為 A 進行調用,然後是 B,然後是 C,而後動作代碼引用將首先為 C 進行調用,然後是 B,最後是 A。

良好的程式碼應確保在設置 require__before 鉤子時,任何先前安裝的鉤子都將被調用,並且它們的返回值(如果是代碼引用)也將被調用。有關示例實現,請參閱 perlfunc 中的 "require"。

require__after

由 ${^HOOK}{require__after} 指示的程序在 require 完成後被 require 調用。它以單個參數,即所需項目的文件名(將套件名轉換為路徑),進行調用。它在 require 完成時執行,無論是通過異常還是通過 require 陳述的完成,您都可以檢查 %INC 以確定 require 是否成功。

require__after 鉤子按照後進先出 (FILO) 的順序為每個所需文件進行調用。換句話說,如果 A 需要 B 需要 C,則 require__after 將首先為 C 進行調用,然後是 B,然後是 A。

$BASETIME
$^T

程式開始運行時的時間,從 1970 年開始的秒數。-M、-A 和 -C 檔案測試返回的值是基於此值。

$PERL_VERSION
$^V

Perl 解釋器的修訂版、版本和子版本,表示為一個 version 物件。

此變數首次出現於 perl v5.6.0;較早版本的 perl 將會看到未定義的值。在 perl v5.10.0 之前,$^V 被表示為一個 v-string 而非一個 version 物件。

$^V 可用於確定執行腳本的 Perl 解釋器是否處於正確的版本範圍。例如

warn "Hashes not randomized!\n" if !$^V or $^V lt v5.8.1

雖然版本物件重載字串化,但要將 $^V 可移植地轉換為其字串表示形式,使用 sprintf()"%vd" 轉換,這對於 v-strings 或版本物件都適用

printf "version is v%vd\n", $^V;  # Perl's version

請參閱 use VERSIONrequire VERSION 的文件,這是一種方便的方式,如果運行的 Perl 解釋器太舊,則會失敗。

另見 "$]" 以獲取 Perl 版本的十進制表示形式。

$^V 相對於 $] 的主要優勢是,在 Perl v5.10.0 或更高版本中,它重載運算符,允許與其他版本表示形式(例如十進制、文字 v-string、"v1.2.3" 或物件)進行輕鬆比較。缺點是,在 v5.10.0 之前,它只是一個文字 v-string,無法輕鬆打印或比較,而 $] 的行為在所有 Perl 版本上都沒有變化。

助記符:使用 ^V 來表示版本物件。

$EXECUTABLE_NAME
$^X

用於執行當前 Perl 副本的名稱,來自 C 的 argv[0] 或(如果支持)/proc/self/exe

根據主機操作系統的不同,$^X 的值可以是 perl 程序文件的相對或絕對路徑名,也可以是用於調用 perl 的字符串,但不是 perl 程序文件的路徑名。此外,大多數操作系統允許調用未包含在 PATH 環境變量中的程序,因此不能保證 $^X 的值在 PATH 中。對於 VMS,該值可能包含或不包含版本號。

通常可以使用 $^X 的值重新調用當前正在運行的相同 perl 的獨立副本,例如

@first_run = `$^X -le "print int rand 100 for 1..100"`;

但請記住,並非所有操作系統都支持分叉或捕獲命令輸出,因此這個複雜的語句可能不具備可移植性。

$^X 的值用作文件的路徑名是不安全的,因為一些在執行命令時對可執行文件具有強制性後綴的操作系統在調用命令時不需要使用後綴。要將 $^X 的值轉換為路徑名,使用以下語句

# Build up a set of file names (not command names).
use Config;
my $this_perl = $^X;
if ($^O ne 'VMS') {
    $this_perl .= $Config{_exe}
    unless $this_perl =~ m/$Config{_exe}$/i;
}

由於許多作業系統允許任何具有 Perl 程式檔案的讀取權限的使用者複製該檔案,修補該複本,然後執行該複本,所以注重安全性的 Perl 程式設計師應該小心調用安裝的 perl 複本,而不是參考 $^X 的複本。以下語句可以實現此目標,並生成可以作為命令調用或文件參考的路徑。

use Config;
my $secure_perl_path = $Config{perlpath};
if ($^O ne 'VMS') {
    $secure_perl_path .= $Config{_exe}
    unless $secure_perl_path =~ m/$Config{_exe}$/i;
}

大多數與正則表達式相關的特殊變數都是副作用。當 Perl 成功完成一個匹配時,Perl 會設置這些變數,因此您應該在使用它們之前檢查匹配結果。例如

if( /P(A)TT(ER)N/ ) {
    print "I found $1 and $2\n";
}

這些變數是只讀的,並且行為類似於動態作用域變數,只有少數例外情況被明確記錄為以不同方式行為。有關詳細信息,請參見以下部分。

正則表達式變數的作用域規則

正則表達式變數允許程式設計師訪問當前動態作用域中最近一次 成功 的正則表達式匹配的狀態。

這些變數本身是全局的並且沒有作用域,但它們訪問的數據類似於動態作用域變數,即每次成功的匹配都表現為將全局狀態對象局部化到當前塊或文件作用域。 (有關動態作用域和 local 關鍵字的詳細信息,請參見 perlsyn 中的 "Compound Statements"。)

一個 成功的匹配 包括搜索和替換運算符 s/// 執行的任何成功匹配以及 m// 運算符執行的匹配。

考慮以下代碼

my @state;
sub matchit {
    push @state, $1;            # pushes "baz"
    my $str = shift;
    $str =~ /(zat)/;            # matches "zat"
    push @state, $1;            # pushes "zat"
}

{
    $str = "foo bar baz blorp zat";
    $str =~ /(foo)/;            # matches "foo"
    push @state, $1;            # pushes "foo"
    {
        $str =~ /(pizza)/;      # does NOT match
        push @state, $1;        # pushes "foo"
        $str =~ /(bar)/;        # matches "bar"
        push @state, $1;        # pushes "bar"
        $str =~ /(baz)/;        # matches "baz"
        matchit($str);          # see above
        push @state, $1;        # pushes "baz"
    }
    $str =~ s/noodles/rice/;    # does NOT match
    push @state, $1;            # pushes "foo"
    $str =~ s/(blorp)/zwoop/;   # matches "blorp"
    push @state, $1;            # pushes "blorp"
}
# the following prints "foo, foo, bar, baz, zat, baz, foo, blorp"
print join ",", @state;

請注意,同一作用域中的每次成功匹配都會覆蓋上一次成功匹配的匹配上下文,但失敗的匹配不會。還要注意,在內部嵌套作用域中,來自外部動態作用域的上一個狀態會持續存在,直到它被另一個成功匹配覆蓋,但當內部嵌套作用域退出時,先前內部成功匹配的任何匹配上下文在作用域結束時都會被恢復。

goto LABEL 可能與動態作用域的匹配上下文產生不良互動是已知問題。這可能無法修復,並且被認為是要避免 goto LABEL 的許多良好理由之一。

性能問題

在 Perl 傳統上,任何程式碼中使用這三個變數 $`$&$'(或其對應的 use English 版本)都會導致所有後續成功的模式匹配都複製匹配的字串,以防程式碼後續可能會存取其中一個變數。這給整個程式帶來了相當大的性能損失,因此一般情況下不鼓勵使用這些變數。

在 Perl 5.6.0 中引入了 @-@+ 動態陣列,它們提供了成功匹配的索引。例如,您可以這樣做:

$str =~ /pattern/;

print $`, $&, $'; # bad: performance hit

print             # good: no performance hit
substr($str, 0,     $-[0]),
substr($str, $-[0], $+[0]-$-[0]),
substr($str, $+[0]);

在 Perl 5.10.0 中引入了 /p 模式匹配運算子標誌以及 ${^PREMATCH}${^MATCH}${^POSTMATCH} 變數,這使您只需在標記為 /p 的模式上承受性能損失。

從 Perl 5.18.0 開始,perl 開始單獨記錄這三個變數的存在,並僅複製所需的字串部分;因此在

$`; $&; "abcdefgh" =~ /d/

perl 只會複製字串的 "abcd" 部分。這在類似以下情況中可能會有很大的區別:

$str = 'x' x 1_000_000;
$&; # whoops
$str =~ /x/g # one char copied a million times, not a million chars

在 Perl 5.20.0 中,一個新的默認啟用的 copy-on-write 系統終於解決了這三個變數的大部分性能問題,並使它們能夠安全地在任何地方使用。

Devel::NYTProfDevel::FindAmpersand 模組可以幫助您找到代碼中這些問題匹配變數的使用。

$<digits> ($1, $2, ...)

包含了當前動態範圍內上一次成功模式匹配中對應的捕獲括號集的子模式。(參見 "正則表達式變數的作用域規則"。)

請注意,捕獲緩衝區與匹配空字符串的捕獲緩衝區之間存在區別。例如,(x?)(x)? 後者可能為 undef,而前者則不是。

這些變數是只讀的。

助記符:類似於 \digits。

@{^CAPTURE}

一個陣列,它暴露了上一次成功模式匹配中的捕獲緩衝區(如果有的話),不包括已退出的嵌套塊中匹配的模式。

請注意,@{^CAPTURE} 的索引 0 相當於 $1,索引 1 相當於 $2,依此類推。

if ("foal"=~/(.)(.)(.)(.)/) {
    print join "-", @{^CAPTURE};
}

應輸出 "f-o-a-l"。

另請參見 "$<digits> ($1, $2, ...)""%{^CAPTURE}""%{^CAPTURE_ALL}"

請注意,與大多數其他正則表達式魔術變數不同,@{^CAPTURE} 沒有單字母的等效形式。另外,當插值此陣列的下標時,您必須使用劃定的變數形式,例如

print "${^CAPTURE[0]}"

請參閱「使用大括號標示變數名稱」在 perldata 以瞭解此形式及其用途的更多資訊。

此變數是在 5.25.7 中新增的。

$MATCH
$&

由最後一次成功的模式匹配所匹配的字串。(參見「正則表達式變數的作用域規則」

請參閱上面的「性能問題」以瞭解在代碼中使用此變數(即使一次)可能帶來的嚴重性能影響。

此變數為只讀,其值具有動態作用域。

助記符:像某些編輯器中的 &

${^MATCH}

只有在使用 /p 修飾符編譯或執行模式時,才保證返回定義值。

這與 $&$MATCH)類似,但要使用它,您必須在執行模式時使用 /p 修飾符,並且它不會產生與該變數相關的性能懲罰。

請參閱上面的「性能問題」

此變數是在 Perl v5.10.0 中新增的。

此變數為只讀,其值具有動態作用域。

$PREMATCH
$`

由最後一次成功的模式匹配之前的字串。(參見「正則表達式變數的作用域規則」)。

請參閱上面的「性能問題」以瞭解在代碼中使用此變數(即使一次)可能帶來的嚴重性能影響。

此變數為只讀,其值具有動態作用域。

助記符:` 經常在引用字符串之前。

${^PREMATCH}

只有在使用 /p 修飾符執行模式時,才保證返回定義值。

這與 $`($PREMATCH)類似,但要使用它,您必須在執行模式時使用 /p 修飾符,並且它不會產生與該變數相關的性能懲罰。

請參閱上面的「性能問題」

此變數是在 Perl v5.10.0 中新增的。

此變數為只讀,其值具有動態作用域。

$POSTMATCH
$'

由最後一次成功的模式匹配之後的字串。(參見「正則表達式變數的作用域規則」)。例子

local $_ = 'abcdefghi';
/def/;
print "$`:$&:$'\n";       # prints abc:def:ghi

請參閱上面的「性能問題」以瞭解在代碼中使用此變數(即使一次)可能帶來的嚴重性能影響。

此變數為只讀,其值具有動態作用域。

助記符:' 經常在引用字符串之後。

${^POSTMATCH}

只有在使用 /p 修飾符編譯或執行模式時,才保證返回定義值。

這與 $'$POSTMATCH)類似,但要使用它,您必須在執行模式時使用 /p 修飾符,並且它不會產生與該變數相關的性能懲罰。

請參閱上面的「性能問題」

此變數是在 Perl v5.10.0 中新增的。

此變數為只讀,其值具有動態作用域。

$LAST_PAREN_MATCH
$+

最後一次成功搜尋模式中最高使用捕獲組匹配的文本。(請參閱"正則表達式變數的作用域規則")。這在邏輯上等同於具有已定義值的最高編號捕獲變量($1$2等)。

如果您不知道一組替代模式中的哪一個匹配,這是很有用的。例如

/Version: (.*)|Revision: (.*)/ && ($rev = $+);

此變數為只讀,其值具有動態作用域。

助記符:要積極且前瞻。

$LAST_SUBMATCH_RESULT
$^N

最後一次成功匹配的最近關閉的使用組(即具有最右邊的右括號的組)匹配的文本。(請參閱"正則表達式變數的作用域規則")。

這與$+略有不同。例如在

"ab" =~ /^((.)(.))$/

我們有

$1,$^N   have the value "ab"
$2       has  the value "a"
$3,$+    have the value "b"

這主要用於在(?{...})塊中檢查最近匹配的文本。例如,為了有效地將文本捕獲到一個變量中(除了$1$2等之外),將(...)替換為

(?:(...)(?{ $var = $^N }))

通過這種方式設置並使用$var,您不必擔心確切地知道它們是哪個編號的括號。

此變數為只讀,其值具有動態作用域。

此變量是在 Perl v5.8.0 中添加的。

助記符:最近關閉的(可能)嵌套括號。

@LAST_MATCH_END
@+

此數組保存了上次成功匹配及其包含的任何匹配捕獲緩衝區的結束偏移量。(請參閱"正則表達式變數的作用域規則"

它包含的元素數將比模式中的捕獲緩衝區數多一個,無論實際上匹配了哪些捕獲緩衝區。您可以使用這個來確定模式中有多少個捕獲緩衝區。(與@-可能有較少元素相對)。

$+[0]是整個匹配的結尾在字符串中的偏移量。這與對匹配變數調用pos函數時返回的值相同。此數組的第n個元素保存了第n個子匹配的偏移量,因此$+[1]$1結束後的偏移量,$+[2]$2結束後的偏移量,依此類推。您可以使用$#+來確定上次成功匹配中有多少子組。請參閱@-變量的示例。

此變數為只讀,其值具有動態作用域。

此變量是在 Perl v5.6.0 中添加的。

%{^CAPTURE}
%LAST_PAREN_MATCH
%+

類似於 @+%+ 散列允許存取命名捕獲緩衝區,在目前活動的動態範圍中,如果存在,則可訪問上一次成功匹配的命名捕獲緩衝區(請參見"正則表達式變數的作用範圍規則")。

例如,$+{foo} 在以下匹配後等同於 $1

'foo' =~ /(?<foo>foo)/;

%+ 散列的鍵僅列出已捕獲(因此與已定義值關聯)的緩衝區的名稱。

如果多個不同的捕獲組具有相同的名稱,則 $+{NAME} 將引用匹配中最左邊的已定義組。

%+ 的底層行為由 Tie::Hash::NamedCapture 模塊提供。

注意: %-%+ 是綁定到上一次成功正則表達式的內部散列的視圖。因此,通過 each 混合迭代訪問它們可能會產生不可預測的結果。同樣,如果上一次成功匹配發生變化,則結果可能會令人意外。

此變量在 Perl v5.10.0 中添加。5.25.7 中添加了 %{^CAPTURE} 別名。

此變數為只讀,其值具有動態作用域。

@LAST_MATCH_START
@-

此數組保存上一次成功匹配及其包含的任何捕獲緩衝區的開始偏移量(請參見"正則表達式變數的作用範圍規則")。

它包含的元素數量將比實際匹配某些內容的最高捕獲緩衝區(也稱為子組)的數量多一個。 (與 @+ 可能包含較少元素不同。)

$-[0] 是上一次成功匹配的開始偏移量。 $-[n] 是第 n 個子模式匹配的子串的開始偏移量,如果子模式未匹配則為 undef。

因此,在與 $_ 匹配後,$& 等同於 substr $_, $-[0], $+[0] - $-[0]。同樣,如果定義了 $-[n],則 $n 等同於 substr $_, $-[n], $+[n] - $-[n],而 $+ 等同於 substr $_, $-[$#-], $+[$#-] - $-[$#-]。可以使用 $#- 找到上一次成功匹配中的最後匹配子組。與正則表達式中的子組數量 $#+ 相對比。

$-[0] 是整個匹配的開始偏移量。此數組的第 n 個元素保存第 n 個子匹配的偏移量,因此 $-[1]$1 開始的偏移量,$-[2]$2 開始的偏移量,以此類推。

在對某個變量 $var 進行匹配後

$` 是與 substr($var, 0, $-[0]) 相同的
$& 是與 substr($var, $-[0], $+[0] - $-[0]) 相同的
$' 是與 substr($var, $+[0]) 相同的
$1 是與 substr($var, $-[1], $+[1] - $-[1]) 相同的
$2 是與 substr($var, $-[2], $+[2] - $-[2]) 相同的
$3 是與 substr($var, $-[3], $+[3] - $-[3]) 相同的

此變數為只讀,其值具有動態作用域。

此變量是在 Perl v5.6.0 中添加的。

%{^CAPTURE_ALL}
%-

%+ 類似,此變數允許訪問當前活動動態範圍內最後一次成功匹配的命名捕獲組。 (參見"正則表達式變量的作用域規則")。對於正則表達式中找到的每個捕獲組名稱,它將關聯到一個包含所有具有該名稱的緩衝區捕獲值的列表的參考(如果有多個),按照它們出現的順序。

這是一個例子

if ('1234' =~ /(?<A>1)(?<B>2)(?<A>3)(?<B>4)/) {
    foreach my $bufname (sort keys %-) {
        my $ary = $-{$bufname};
        foreach my $idx (0..$#$ary) {
            print "\$-{$bufname}[$idx] : ",
                  (defined($ary->[$idx])
                      ? "'$ary->[$idx]'"
                      : "undef"),
                  "\n";
        }
    }
}

將輸出

$-{A}[0] : '1'
$-{A}[1] : '3'
$-{B}[0] : '2'
$-{B}[1] : '4'

%- 哈希的鍵對應於正則表達式中找到的所有緩衝區名稱。

%- 的行為是通過Tie::Hash::NamedCapture模塊實現的。

注意: %-%+ 是綁定到與最後一次成功正則表達式相關聯的常規內部哈希的視圖。因此,通過each對它們的迭代訪問可能會產生不可預測的結果。同樣,如果最後一次成功匹配發生更改,則結果可能會令人意外。參見"正則表達式變量的作用域規則"

此變數添加於 Perl v5.10.0 中。 5.25.7 中添加了 %{^CAPTURE_ALL} 別名。

此變數為只讀,其值具有動態作用域。

${^LAST_SUCCESSFUL_PATTERN}

目前範圍中最後一個成功匹配的模式。空模式預設匹配至此。例如

if (m/foo/ || m/bar/) {
    s//BLAH/;
}

if (m/foo/ || m/bar/) {
    s/${^LAST_SUCCESSFUL_PATTERN}/BLAH/;
}

是等效的。

您可以使用此功能來除錯最後匹配的模式,或再次與其匹配。

自 Perl 5.37.10 版本中新增。

$LAST_REGEXP_CODE_RESULT
$^R

上次成功評估的(?{ code })正則表達式斷言的結果(請參閱perlre)。

這個變數可以進行寫入操作,其值的作用範圍正常,不像大多數其他正則表達式變數。

此變數於 Perl 5.005 版本中新增。

${^RE_COMPILE_RECURSION_LIMIT}

當前設定的最大開啟但未關閉的括號群組數量,在正則表達式編譯期間可能存在的最大數量。目前的默認值為 1000 個嵌套群組。您可以根據需要和可用內存量進行調整。

此變數於 Perl v5.30.0 版本中新增。

${^RE_DEBUG_FLAGS}

正則表達式調試標誌的當前值。即使加載了re 'debug'模塊,設置為 0 也不會產生調試輸出。詳情請參閱re

此變數是在 Perl v5.10.0 中新增的。

${^RE_TRIE_MAXBUF}

控制某些正則表達式優化的應用方式以及它們使用的內存量。默認值為 65536,對應於 512kB 的臨時緩存。將其設置為較高的值以在匹配大型替換時以內存換取速度。如果您希望優化方式盡可能保守地使用內存但仍然發生,則將其設置為較低的值,將其設置為負值以防止優化並節省最多的內存。在正常情況下,此變數對您應該沒有興趣。

此變數是在 Perl v5.10.0 中新增的。

與當前選定的文件處理相關的變數可以通過在IO::Handle對象上調用適當的對象方法來設置,儘管這比使用常規內建變數效率低。 (此摘要下方的總結行包含單詞 HANDLE。)首先,您必須說

use IO::Handle;

在此之後,您可以使用以下任一種方法:

method HANDLE EXPR

或者更加安全的方法:

HANDLE->method(EXPR)

每個方法都會返回 IO::Handle 屬性的舊值。每個方法都接受一個可選的 EXPR,如果提供了 EXPR,則該 EXPR 指定了要更改的 IO::Handle 屬性的新值。如果未提供 EXPR,則大多數方法對當前值不做任何操作——除了 autoflush(),它會為您假設為 1,只是為了與眾不同。

因為在 IO::Handle 類中加載是一個昂貴的操作,您應該學習如何使用常規內建變量。

這些變量中有幾個被認為是 "只讀" 的。這意味著如果您嘗試直接或間接地通過引用將值分配給此變量,則會引發運行時異常。

在修改本文件中描述的大多數特殊變量的默認值時,您應該非常小心。在大多數情況下,您希望在更改它們之前對這些變量進行本地化,因為如果不這樣做,則您已更改的特殊變量的默認值可能會影響依賴於這些默認值的其他模塊。這是一次性讀取整個文件的正確方式之一

open my $fh, "<", "foo" or die $!;
local $/; # enable localized slurp mode
my $content = <$fh>;
close $fh;

但是以下代碼非常糟糕

open my $fh, "<", "foo" or die $!;
undef $/; # enable slurp mode
my $content = <$fh>;
close $fh;

因為其他一些模塊可能希望以默認的 "行模式" 從某個文件中讀取數據,所以如果剛才提出的代碼已被執行,那麼全局值 $/ 現在已經為在同一個 Perl 解釋器中運行的任何其他代碼更改。

通常,當對變量進行本地化時,您希望確保此更改影響的範圍盡可能短。因此,除非您已經處於某個短 {} 塊內,否則您應該自行創建一個。例如

my $content = '';
open my $fh, "<", "foo" or die $!;
{
    local $/;
    $content = <$fh>;
}
close $fh;

以下是您自己的代碼如何出錯的示例

for ( 1..3 ){
    $\ = "\r\n";
    nasty_break();
    print "$_";
}

sub nasty_break {
    $\ = "\f";
    # do something with $_
}

您可能希望此代碼打印出等效於以下內容

"1\r\n2\r\n3\r\n"

但實際上您會得到

"1\f2\f3\f"

為什麼?因為 nasty_break() 在不進行本地化的情況下修改了 $\。您在 nasty_break() 中設置的值在返回時仍然存在。修正方法是添加 local(),這樣值就不會洩漏出 nasty_break()

local $\ = "\f";

在這樣一個簡短的示例中很容易注意到問題,但是在更複雜的代碼中,如果不對特殊變量的更改進行本地化,則您可能會遇到麻煩。

$ARGV

在從<>讀取時,包含當前文件的名稱。

@ARGV

數組@ARGV包含為腳本指定的命令行參數。$#ARGV通常是參數數量減一,因為$ARGV[0]是第一個參數,不是程序的命令名本身。請參見"$0"獲取命令名。

ARGV

特殊的文件句柄,用於迭代@ARGV中的命令行文件名。通常寫作空文件句柄在角度運算符<>中。請注意,目前ARGV僅在<>運算符內具有其神奇的效果;在其他地方,它只是一個對應到<>最後一個打開的文件的普通文件句柄。特別地,將\*ARGV作為參數傳遞給期望文件句柄的函數可能不會導致您的函數自動讀取@ARGV中所有文件的內容。

ARGVOUT

執行使用-i進行就地編輯處理時指向當前打開的輸出文件的特殊文件句柄。當您需要進行大量插入且不希望不斷修改$_時,這很有用。參見perlrun獲取-i開關。

IO::Handle->output_field_separator( EXPR )
$OUTPUT_FIELD_SEPARATOR
$OFS
$,

用於print運算符的輸出字段分隔符。如果定義了,則此值在print的每個參數之間打印。默認為undef

您無法在文件句柄上調用output_field_separator(),只能作為靜態方法調用。參見IO::Handle

助記符:在您的print語句中有","時打印的內容。

HANDLE->input_line_number( EXPR )
$INPUT_LINE_NUMBER
$NR
$.

上一個訪問的文件句柄的當前行號。

Perl中的每個文件句柄都計算從中讀取的行數。(根據$/的值,Perl對於什麼構成一行的理解可能與您的不一致。)當從文件句柄讀取一行(通過readline()<>),或者調用tell()seek()時,$.變成該文件句柄的行計數器的別名。

您可以通過賦值給$.來調整計數器,但這不會實際移動查找指針。本地化$.不會本地化文件句柄的行計數。相反,它會本地化Perl對於$.當前別名的文件句柄的概念。

$. 在文件句柄关闭时重置,但在未进行 close() 的情况下重新打开已打开的文件句柄时不会重置。要了解更多详情,请参阅 perlop 中的 "I/O Operators"。因为 <> 从不进行显式关闭,所以在 ARGV 文件中,行号会在文件间增加(但请参阅 perlfunc 中的 "eof" 中的示例)。

您还可以使用 HANDLE->input_line_number(EXPR) 来访问给定文件句柄的行计数器,而不必担心您最后访问的是哪个句柄。

助记符:许多程序使用 "." 表示当前行号。

IO::Handle->input_record_separator( EXPR )
$INPUT_RECORD_SEPARATOR
$RS
$/

输入记录分隔符,默认为换行符。这会影响 Perl 对 "行" 的概念。工作方式类似于 awk 的 RS 变量,包括将空行视为终止符(如果设置为空字符串,则空行不能包含任何空格或制表符)。您可以将其设置为多字符字符串以匹配多字符终止符,或将其设置为 undef 以读取至文件末尾。将其设置为 "\n\n" 与设置为 "" 稍有不同,如果文件包含连续的空行。将其设置为 "" 将将两个或更多连续的空行视为单个空行。将其设置为 "\n\n" 将盲目地假设下一个输入字符属于下一个段落,即使它是一个换行符也是如此。

local $/;           # enable "slurp" mode
local $_ = <FH>;    # whole file now here
s/\n[ \t]+/ /g;

请记住: $/ 的值是字符串,而不是正则表达式。对于某些方面,awk 可能更好。:-)

$/ 设置为空字符串(所谓的 段落模式)需要特别注意。当 $/ 设置为 "" 且使用该设置读取整个文件时,文件开头的任意数量的一个或多个连续换行符将被丢弃。除了文件中的最后一个记录外,每个以两个或多个换行符结尾的字符序列都被视为一个记录,并且将读取以确切两个换行符结尾。如果文件中的最后一个记录以零个或一个连续换行符结尾,则该记录将以相应数量的换行符结尾。如果文件中的最后一个记录以两个或多个连续换行符结尾,则该记录将与所有之前的记录一样以两个换行符结尾。

假设我们将以下字符串写入文件

my $string = "\n\n\n";
$string .= "alpha beta\ngamma delta\n\n\n";
$string .= "epsilon zeta eta\n\n";
$string .= "theta\n";

my $file = 'simple_file.txt';
open my $OUT, '>', $file or die;
print $OUT $string;
close $OUT or die;

現在我們以段落模式讀取該文件

local $/ = ""; # paragraph mode
open my $IN, '<', $file or die;
my @records = <$IN>;
close $IN or die;

@records 將包含這三個字串

(
  "alpha beta\ngamma delta\n\n",
  "epsilon zeta eta\n\n",
  "theta\n",
)

$/ 設置為整數引用、包含整數的純量或可轉換為整數的純量將嘗試讀取記錄而不是行,最大記錄大小為參考整數數字個字符。所以這樣

local $/ = \32768; # or \"32768", or \$var_containing_32768
open my $fh, "<", $myfile or die $!;
local $_ = <$fh>;

將從 $fh 讀取不超過 32768 字元的記錄。如果您不是從記錄導向的文件(或您的操作系統沒有記錄導向的文件),則可能每次讀取都會得到完整的數據塊。如果記錄大於您設置的記錄大小,則會分段返回記錄。嘗試將記錄大小設置為零或更小是不推薦的,將導致 $/ 的值為 "undef",這將導致(其餘部分的)整個文件讀取。

截至 5.19.9 將 $/ 設置為任何其他形式的引用將引發致命異常。這是為了為將來支持新的設置 $/ 方法作準備。

僅在 VMS 上,記錄讀取會繞過 PerlIO 層和任何相關的緩衝,因此您不能在同一文件處理程序上混合記錄和非記錄讀取。只有當相同的緩衝層用於兩種模式時,記錄模式才與行模式混合。

您無法在處理程序上調用 input_record_separator(),只能作為靜態方法。請參見 IO::Handle

另請參見 perlport 中的 "換行符"。還請參見 "$."

助記符:當引用詩歌時,/ 會限定行界限。

IO::Handle->output_record_separator( EXPR )
$OUTPUT_RECORD_SEPARATOR
$ORS
$\

print 運算符的輸出記錄分隔符。如果定義了,則此值將在 print 的最後一個參數之後打印出來。默認值為 undef

您無法在處理程序上調用 output_record_separator(),只能作為靜態方法。請參見 IO::Handle

助記符:您設置 $\ 而不是在 print 的末尾添加 "\n"。此外,它就像 $/ 一樣,但它是從 Perl 中獲得的 "返回"。

HANDLE->autoflush( EXPR )
$OUTPUT_AUTOFLUSH
$|

若設置為非零,則會立即強制刷新當前選定的輸出通道,以及每次寫入或打印之後。默認值為 0(無論該通道是否實際由系統緩衝;$| 只告訴您是否已明確要求 Perl 在每次寫入後刷新)。若輸出到終端,則 STDOUT 通常是行緩衝的;否則是塊緩衝的。設置此變量主要在輸出到管道或套接字時很有用,例如在運行 Perl 程序並希望即時查看輸出時。這不會影響輸入緩衝。有關此的請參閱 perlfunc 中的 "getc"。有關如何選擇輸出通道的請參閱 perlfunc 中的 "select"。另請參閱 IO::Handle。

助記符:當您希望管道保持高熱時。

${^LAST_FH}

此為只讀變量,包含對最後讀取的文件句柄的引用。這是由 <HANDLE>readlinetelleofseek 設置的。這是 Perl 在錯誤或警告消息中附加 ", <STDIN> line 1" 時使用的句柄。

此變量是在 Perl v5.18.0 中添加的。

格式的特殊變量是文件句柄的一個子集。有關 Perl 格式的更多信息,請參閱 perlform。

$ACCUMULATOR
$^A

format() 行的 write() 累加器的當前值。格式包含將其結果放入 $^Aformline() 調用。調用其格式後,write() 將打印出 $^A 的內容並清空。因此,您實際上永遠不會看到 $^A 的內容,除非您自己調用 formline() 然後查看它。有關此的請參閱 perlform 和 perlfunc 中的 "formline PICTURE,LIST"。

IO::Handle->format_formfeed(EXPR)
$FORMAT_FORMFEED
$^L

格式輸出為分頁符的內容。默認值為 \f

您無法對句柄調用 format_formfeed(),只能作為靜態方法調用。請參閱 IO::Handle。

HANDLE->format_page_number(EXPR)
$FORMAT_PAGE_NUMBER
$%

當前所選輸出通道的當前頁碼。

記憶提示:在 nroff 中,% 是頁碼。

HANDLE->format_lines_left(EXPR)
$FORMAT_LINES_LEFT
$-

當前所選輸出通道的頁面上剩餘的行數。

記憶提示:lines_on_page - lines_printed。

IO::Handle->format_line_break_characters EXPR
$FORMAT_LINE_BREAK_CHARACTERS
$:

在格式中的連續字段(以 ^ 開始)中斷字符串填充的當前字符集。默認值為" \n-",以空格、換行符或連字符斷開。

您無法在處理程序上調用format_line_break_characters(),只能作為靜態方法調用。參見IO::Handle

記憶提示:詩歌中的 "colon" 是一行的一部分。

HANDLE->format_lines_per_page(EXPR)
$FORMAT_LINES_PER_PAGE
$=

當前所選輸出通道的頁面長度(可打印行數)。默認值為 60。

記憶提示:= 有水平線。

HANDLE->format_top_name(EXPR)
$FORMAT_TOP_NAME
$^

當前所選輸出通道的當前頁首格式的名稱。默認值為帶有_TOP附加的文件處理程序的名稱。例如,STDOUT 文件處理程序的默認格式頂部名稱為STDOUT_TOP

記憶提示:指向頁面頂部。

HANDLE->format_name(EXPR)
$FORMAT_NAME
$~

當前所選輸出通道的當前報告格式的名稱。默認格式名稱與文件處理程序名稱相同。例如,STDOUT 文件處理程序的默認格式名稱為STDOUT

記憶提示:與$^相對應。

Error Variables

變量$@$!$^E$?包含有關Perl程序執行過程中可能出現的不同類型錯誤條件的信息。這些變量按照報告錯誤的子系統與Perl進程之間的 "距離" 排序。它們分別對應於Perl解釋器、C庫、操作系統或外部程序檢測的錯誤。

為了說明這些變量之間的區別,請考慮以下Perl表達式,它使用單引號字符串。在執行此語句後,perl可能已設置了所有四個特殊錯誤變量

eval q{
    open my $pipe, "/cdrom/install |" or die $!;
    my @res = <$pipe>;
    close $pipe or die "bad pipe: $?, $!";
};

當perl執行eval()表達式時,它將C運行時庫中的open()<PIPE>close調用翻譯為操作系統內核。如果其中一個調用失敗,perl將$!設置為C庫的errno

$@在以下情況下被設置:如果要被eval的字串無法編譯(這可能發生在openclose被以錯誤的原型導入時),或者在評估期間執行的 Perl 代碼調用了die()。在這些情況下,$@的值是編譯錯誤,或者是die的參數(將插入$!$?)。 (另見Fatal)。

在一些操作系統下,$^E可能包含更詳細的錯誤指示,例如在這個案例中,"CDROM 閘板未關閉"。不支援擴展錯誤消息的系統會讓$^E$!相同。

最後,如果外部程序/cdrom/install失敗,$?可能被設置為非 0 的值。高 8 位反映程序遇到的具體錯誤條件(程序的exit()值)。低 8 位反映失敗模式,如信號死亡和核心轉儲信息。詳情請參見wait(2)。與只在檢測到錯誤條件時設置的$!$^E不同,變量$?在每次wait或管道close時都會設置,覆蓋舊值。這更像是$@,每次eval()失敗時都會設置,成功時清除。

更多詳情,請參見$@$!$^E$?的個別描述。

${^CHILD_ERROR_NATIVE}

上一次管道關閉、反引號(``)命令、成功調用wait()waitpid(),或者system()運算符返回的本機狀態。在類 POSIX 系統上,可以使用POSIX模塊提供的 WIFEXITED、WEXITSTATUS、WIFSIGNALED、WTERMSIG、WIFSTOPPED 和 WSTOPSIG 函數對此值進行解碼。

在 VMS 下,這反映了實際的 VMS 退出狀態;即當使用use vmsish 'status'時,它與$?相同。

此變數是在 Perl v5.10.0 中新增的。

$EXTENDED_OS_ERROR
$^E

特定於當前操作系統的錯誤信息。目前,這在 VMS、OS/2 和 Win32(以及 MacPerl)下與"$!"不同。在所有其他平台上,$^E始終與$!相同。

在 VMS 下,$^E提供了上一個系統錯誤的 VMS 狀態值。這是有關上一個系統錯誤的更具體信息,比$!提供的更重要。當$!設置為EVMSERR時,這尤其重要。

在 OS/2 下,$^E 設置為最後一次通過 CRT 或直接從 Perl 調用 OS/2 API 的錯誤代碼。

在 Win32 下,$^E 始終返回由 Win32 調用 GetLastError() 報告的最後一個錯誤信息,該信息描述了從 Win32 API 內部報告的最後一個錯誤。大多數 Win32 特定的代碼將通過 $^E 報告錯誤。 ANSI C 和類 Unix 調用設置 errno,因此大多數可移植的 Perl 代碼將通過 $! 報告錯誤。

"$!" 的描述中提到的注意事項通常也適用於 $^E

此變量於 Perl 5.003 中添加。

記憶法:額外的錯誤解釋。

$EXCEPTIONS_BEING_CAUGHT
$^S

解譯器的當前狀態。

$^S         State
---------   -------------------------------------
undef       Parsing module, eval, or main program
true (1)    Executing an eval or try block
false (0)   Otherwise

第一種狀態可能發生在 $SIG{__DIE__}$SIG{__WARN__} 處理程序中。

英文名稱 $EXCEPTIONS_BEING_CAUGHT 有點誤導,因為 undef 值不表示是否捕獲到異常,因為主程序的編譯不捕獲異常。

此變量於 Perl 5.004 中添加。

$WARNING
$^W

警告開關的當前值,如果使用了 -w,則初始值為 true,否則為 false,但可直接修改。

另見 warnings

記憶法:與 -w 開關相關。

${^WARNING_BITS}

use warnings 指示啟用的警告檢查的當前集合。它的作用域與 $^H%^H 變量相同。準確的值被認為是 warnings pragma 的內部,並且可能在不同版本的 Perl 之間更改。

每當一個語句編譯完成時,當前的 ${^WARNING_BITS} 值將與該語句一起存儲,並且稍後可以通過 (caller($level))[9] 檢索。

此變量是在 Perl v5.6.0 中添加的。

$OS_ERROR
$ERRNO
$!

當引用時,$! 檢索 C 的 errno 整數變量的當前值。如果將數值賦給 $!,則該值將存儲在 errno 中。當作為字符串引用時,$! 會產生與 errno 相對應的系統錯誤字符串。

許多系統或函式庫呼叫在失敗時設置 errno 來指示失敗的原因。它們通常在成功時不會將 errno 設置為零,並且可能在成功時將 errno 設置為非零值。這意味著 errno,因此 $!,僅在 失敗 之後 有意義

if (open my $fh, "<", $filename) {
    # Here $! is meaningless.
    ...
}
else {
    # ONLY here is $! meaningful.
    ...
    # Already here $! might be meaningless.
}
# Since here we might have either success or failure,
# $! is meaningless.

在這裡,無關 意味著 $! 可能與 open() 運算子的結果無關。對 $! 的賦值同樣是短暫的。它可以在調用 die() 運算子之前立即使用,以設置退出值,或者檢查與錯誤 n 相對應的系統錯誤字符串,或者恢復 $! 到有意義的狀態。

即使未執行任何系統調用,Perl 本身也可能在失敗時將 errno 設置為非零。

記憶法:剛才發生了什麼事?

%OS_ERROR
%ERRNO
%!

%! 的每個元素僅在 $! 設置為該值時才具有真值。例如,如果 $! 的當前值是 ENOENT,則 $!{ENOENT} 為 true;也就是說,如果最近的錯誤是 "No such file or directory"(或其道義等同物:並非所有操作系統都會提供該準確的錯誤,當然也不是所有語言都會提供),則為 true。具體的 true 值不保證,但過去通常是 $! 的數值。要檢查系統上特定鍵是否有意義,請使用 exists $!{the_key};要獲取合法鍵的列表,請使用 keys %!。有關更多信息,請參閱 Errno,也請參閱 "$!"

此變數於 Perl 5.005 版本中新增。

$CHILD_ERROR
$?

最後一個管道關閉、反引號(``)命令、成功調用 wait()waitpid(),或 system() 運算子返回的狀態。這只是傳統 Unix wait() 系統調用返回的 16 位狀態字(或者看起來像它)。因此,子進程的退出值實際上是($? >> 8),$? & 127 給出進程死亡的信號(如果有的話),$? & 128 報告是否有核心轉儲。

此外,如果 C 語言中支持 h_errno 變量,則任何 gethost*() 函數失敗時,其值將通過 $? 返回。

如果您已經為SIGCHLD安裝了信號處理程序,則在該處理程序之外,$?的值通常會是錯誤的。

END子程序內部,$?包含將要傳遞給exit()的值。您可以在END子程序中修改$?以更改程序的退出狀態。例如

END {
    $? = 1 if $? == 255;  # die would make it 255
}

在VMS下,使用pragma use vmsish 'status'使$?反映實際的VMS退出狀態,而不是默認的模擬POSIX狀態;有關詳細信息,請參見perlvms中的"$?"

記憶法:與shksh類似。

$EVAL_ERROR
$@

上一個eval運算符引起的Perl錯誤,即最後捕獲的異常。對於eval BLOCK,這要么是運行時錯誤消息,要么是調用die時的字符串或引用。eval STRING形式還會捕獲語法錯誤和其他編譯時異常。

如果沒有錯誤發生,eval$@設置為空字符串。

警告消息不會收集在這個變量中。但是,您可以通過設置$SIG{__WARN__}來設置一個處理警告的例程,如"%SIG"中所述。

記憶法:錯誤發生的地方是"at"哪裡?

這些變量提供有關當前解譯器狀態的信息。

$COMPILING
$^C

-c開關關聯的標誌的當前值。主要用於與-MO=...一起使用,以允許代碼在編譯時改變其行為,例如在編譯時而不是正常的,延遲加載時AUTOLOAD。設置$^C = 1類似於調用B::minus_c

此變量是在 Perl v5.6.0 中添加的。

$DEBUGGING
$^D

調試標誌的當前值。可以讀取或設置。與其命令行等效一樣,您可以使用數字或符號值,例如$^D = 10$^D = "st"。參見perlrun中的"-Dnumber"。此變量的內容也會影響調試器操作。參見perldebguts中的"調試器內部"

記憶法:值的-D開關。

${^GLOBAL_PHASE}

perl解譯器的當前階段。

可能的值包括

CONSTRUCT

PerlInterpreter* 透過 perl_construct 進行構造。此值主要是為了完整性而存在,以及通過底層 C 變量 PL_phase 使用。除非解釋器的構造完成,否則不太可能執行 Perl 代碼。

START

這是全局編譯時間。基本上,這包括直接或間接從頂層程序的編譯時間執行的每個 BEGIN 塊。

此階段未稱為“BEGIN”,以避免與 BEGIN 塊混淆,因為這些塊在任何編譯單元的編譯時間執行,而不僅僅是頂層程序。例如,通過類似 eval "use SomeModule" 的構造進入的新的、局部化的編譯時間不是全局解釋器階段,因此不會被 ${^GLOBAL_PHASE} 反映。

CHECK

執行任何 CHECK 塊。

INIT

與“CHECK”類似,但用於 INIT 塊,而不是 CHECK 塊。

RUN

主要運行時間,即執行 PL_main_root

END

執行任何 END 塊。

DESTRUCT

全局銷毀。

還要注意,沒有 UNITCHECK 塊的值。這是因為這些塊為每個編譯單元單獨運行,因此不是全局解釋器階段。

不是每個程序都必須經歷可能的每個階段,但從一個階段過渡到另一個階段只能按照上面列表中描述的順序進行。

Perl 代碼可以看到的所有階段的示例

BEGIN { print "compile-time: ${^GLOBAL_PHASE}\n" }

INIT  { print "init-time: ${^GLOBAL_PHASE}\n" }

CHECK { print "check-time: ${^GLOBAL_PHASE}\n" }

{
    package Print::Phase;

    sub new {
        my ($class, $time) = @_;
        return bless \$time, $class;
    }

    sub DESTROY {
        my $self = shift;
        print "$$self: ${^GLOBAL_PHASE}\n";
    }
}

print "run-time: ${^GLOBAL_PHASE}\n";

my $runtime = Print::Phase->new(
    "lexical variables are garbage collected before END"
);

END   { print "end-time: ${^GLOBAL_PHASE}\n" }

our $destruct = Print::Phase->new(
    "package variables are garbage collected after END"
);

這將打印出

compile-time: START
check-time: CHECK
init-time: INIT
run-time: RUN
lexical variables are garbage collected before END: RUN
end-time: END
package variables are garbage collected after END: DESTRUCT

此變量於 Perl 5.14.0 中添加。

$^H

警告:此變量嚴格用於內部使用。其可用性、行為和內容可能會隨時更改,恕不另行通知。

此變量包含 Perl 解釋器的編譯時提示。在 BLOCK 編譯結束時,此變量的值將恢復到解釋器開始編譯 BLOCK 時的值。

每次語句編譯完成時,當前的 $^H 值將與該語句一起存儲,稍後可以通過 (caller($level))[8] 檢索。參見 perlfunc 中的 "caller EXPR"

當 perl 開始解析提供語彙範圍的任何區塊結構(例如,eval 主體、所需檔案、子程式主體、迴圈主體或條件區塊)時,現有的 $^H 值將被保存,但其值不變。當區塊的編譯完成後,它將恢復保存的值。在保存和恢復其值的點之間,執行 BEGIN 區塊內的程式碼可以自由更改 $^H 的值。

此行為提供了語彙範圍的語義,例如,在 use strict 嚴格模式中使用。

內容應該是整數;其不同的位元用於不同的語法標誌。這裡是一個例子。

sub add_100 { $^H |= 0x100 }

sub foo {
    BEGIN { add_100() }
    bar->baz($boon);
}

考慮在執行 BEGIN 區塊期間發生的情況。此時 BEGIN 區塊已經被編譯,但 foo() 主體仍在編譯中。因此,在 foo() 主體編譯時,新值 $^H 將是可見的。

BEGIN { add_100() } 區塊替換為

BEGIN { require strict; strict->import('vars') }

演示了如何實現 use strict 'vars'。這裡是相同語彙 pragma 的條件版本

BEGIN {
    require strict; strict->import('vars') if $condition
}

此變量於 Perl 5.003 中添加。

%^H

%^H 散列提供與 $^H 相同的語彙範圍語義。這使其非常適合用於實現語彙範圍的 pragma。查看 perlpragma。在運行時存取時,所有項目都會被轉換為字串,因此只能容納簡單的值。例如,不能有對物件的參考。

每次一個語句完成編譯時,當前的 %^H 值將與該語句一起存儲,稍後可以通過 (caller($level))[10] 檢索。參見 perlfunc 中的 "caller EXPR"

在將項目放入 %^H 中時,為了避免與散列的其他使用者產生衝突,有一個關於使用哪些鍵的慣例。模組應僅使用以模組名稱(其主要包的名稱)和 "/" 字符開頭的鍵。例如,模組 Foo::Bar 應使用像 Foo::Bar/baz 這樣的鍵。

此變量是在 Perl v5.6.0 中添加的。

${^OPEN}

PerlIO 使用的內部變數。一個字符串由兩部分組成,由一個 \0 字節分隔,第一部分描述了輸入層,第二部分描述了輸出層。

這是應用「open」pragma的詞彙效果的機制,以及對於「-C」命令行開關和「PERL_UNICODE」環境變量的「io」或「D」選項的主程式作用域效果的機制。

函數「accept()」、「open()」、「pipe()」、「readpipe()」(以及相關的「qx」和「`STRING`」運算符)、「socket()」、「socketpair()」和「sysopen()」都受到此變量的詞彙值的影響。由「readline()」(或相關的「<>」和「<><<>>」運算符)打開的隱式「ARGV」處理程序也受到影響(但如果它打開「STDIN」則不受影響)。如果未設置此變量,則這些函數將設置默認的層,如「PerlIO」中描述的「默認值和如何覆蓋它們」。

當使用3個參數並指定了顯式層時,「open()」忽略此變量(和默認層)。通過「IO::Handle」等模塊間接調用這些函數不受影響,因為它們發生在不同的詞彙範圍內。目前未受影響的目錄處理程序,如「opendir()」打開的目錄處理程序。

此變量是在 Perl v5.8.0 中添加的。

$PERLDB
$^P

用於調試支持的內部變量。各種位的含義可能會發生變化,但目前表示

0x01

調試子程序進入/退出。

0x02

逐行調試。導致每執行一次語句都調用「DB::DB()」子程序。還導致保存源代碼行(如0x400)。

0x04

關閉優化。

0x08

保留更多數據以供將來的交互式檢查。

0x10

保留有關定義子程序的源行信息。

0x20

啟動單步。

0x40

在報告時使用子程序地址而不是名稱。

0x80

報告 goto &subroutine 也。

0x100

根據編譯的地點,為評估提供資訊性的「檔案」名稱。

0x200

根據編譯的地點,為匿名的子程式提供資訊性的名稱。

0x400

將原始碼行保存到 @{"_<$filename"} 中。

0x800

保存原始碼時,包括不生成子程式的評估。

0x1000

保存原始碼時,包括未編譯的原始碼。

有些位元可能僅在編譯時相關,有些可能僅在執行時相關。這是一個新的機制,細節可能會變化。另請參見 perldebguts

${^TAINT}

反映塗抹模式是否開啟。1 表示開啟(程式以 -T 運行),0 表示關閉,-1 表示僅啟用塗抹警告(即使用 -t-TU)。

注意:如果您的 Perl 是沒有塗抹支援構建的(請參見 perlsec),則 ${^TAINT} 將始終為 0,即使程式以 -T 運行。

此變數是只讀的。

此變量是在 Perl v5.8.0 中添加的。

${^SAFE_LOCALES}

反映此 Perl 是否可用安全的地區操作(值為 1)或不可用(值為 0)。如果 Perl 無線程編譯,則此變數始終為 1。如果此 Perl 使用線程安全的地區操作,則此變數也為 1。請注意,個別線程可以通過調用 perlapi 中的 "switch_to_global_locale" 來選擇使用全局地區(通常是不安全的)。此變數在這種線程中目前仍設置為 1。

此變數是只讀的。

此變數於 Perl v5.28.0 中添加。

${^UNICODE}

反映 Perl 的某些 Unicode 設置。有關可能值的更多信息,請參見 perlrun 文件中有關 -C 開關的信息。

此變數在 Perl 啟動時設置,之後為只讀。

此變數是在 Perl v5.8.2 中新增的。

${^UTF8CACHE}

此變數控制內部 UTF-8 偏移緩存代碼的狀態。1 表示啟用(默認值),0 表示禁用,-1 表示通過對所有結果進行線性掃描來調試緩存代碼,並在任何差異時發出警告。

此變數是在 Perl v5.8.9 中新增的。它可能會在不通知的情況下進行更改或刪除,但目前用於避免重新計算多字節 UTF-8 編碼字符的邊界。

${^UTF8LOCALE}

此變數指示 perl 在啟動時是否檢測到 UTF-8 區域設置。當 perl 運行時處於 adjust-utf8ness-to-locale 模式時(例如使用 -CL 命令行開關運行),此信息將被 perl 使用;有關此信息的更多信息,請參見 perlrun

此變數是在 Perl v5.8.8 中新增的。

已棄用且已刪除的變數

棄用變數宣布了 perl 維護者最終從語言中刪除該變數的意圖。儘管其狀態可能仍可用。使用已棄用的變數將觸發警告。

一旦移除變數,其使用將觸發錯誤,告知您該變數不受支援。

有關錯誤消息的詳細信息,請參見 perldiag

$#

$# 是一個用於格式化打印數字的變數。在一個棄用週期後,其魔法在 Perl v5.10.0 中被移除,現在使用它將觸發警告:$# 不再支援

這不是您在數組名稱前面使用的符號,用於獲取最後一個索引,如 $#array。在 Perl 中,這仍然是獲取數組的最後一個索引的方法。這兩者之間沒有任何關聯。

在 Perl 5 中已棄用。

在 Perl v5.10.0 中刪除。

$*

$* 是一個您可以使用的變數,用於啟用多行匹配。在一個棄用週期後,其魔法在 Perl v5.10.0 中被移除。現在使用它將觸發警告:$* 不再支援。您應該使用 /s/m 正則表達式修飾符代替。

在 Perl 5 中已棄用。

在 Perl v5.10.0 中刪除。

$[

此變數存儲數組中第一個元素的索引,以及子字符串中第一個字符的索引。默認值為 0,但您可以理論上將其設置為 1,以使 Perl 的子腳本和評估 index() 和 substr() 函數時的行為更像 awk(或 Fortran)。

在 Perl 5 的第 5 版中,對 $[ 的賦值被視為編譯器指示,不會影響任何其他檔案的行為。(這就是為什麼你只能將其分配給編譯時常數。)強烈不建議使用它。

在 Perl v5.10.0 之前,對 $[ 的賦值可以從相同文件中的外部語彙範圍中看到,不像其他編譯時指示(例如 strict)。對其使用 local() 會將其值嚴格地綁定到語彙塊。現在它始終是語彙範圍的。

自 Perl v5.16.0 起,它由 arybase 模組實現。

從 Perl v5.30.0 開始,或在 use v5.16no feature "array_base" 下,$[ 不再有任何效果,並且始終包含 0。允許將其分配為 0,但任何其他值將產生錯誤。

助記:[ 開始下標。

在 Perl v5.12.0 中已廢棄。

${^ENCODING}

此變數不再受支持。

它曾經保存將源代碼轉換為 Unicode 的 對象引用Encode 對象。

它的目的是允許您的非 ASCII Perl 腳本不必以 UTF-8 編寫;這在普遍使用以 UTF-8 編碼的文本的編輯器之前很有用,但那是很久以前的事了。它會引起問題,例如影響其他沒有預期到它的模塊的操作,造成一般混亂。

如果您需要類似此功能的東西,建議您使用簡單的源代碼過濾器,例如 Filter::Encoding

如果您是因為您的代碼受到某人對此變量的使用而受到不利影響而來到這裡,通常可以通過執行此操作

local ${^ENCODING};

在受到包含的函數的執行範圍內,這樣做將取消定義該變數。

此變數於 Perl 5.8.2 中添加,並在 5.26.0 中刪除。在 Perl 5.28.0 中,將其設置為除 undef 之外的任何值都會導致致命錯誤。

${^WIN32_SLOPPY_STAT}

此變數不再具有任何功能。

此變數於 Perl v5.10.0 中添加,並於 Perl v5.34.0 中刪除。