$EVAL_ERROR
$@ 最近一个 eval() 运算符返回的 Perl 语法错误消息。 若 $@
是空字符串,则最近一次 eval() 进行了正确的解析和执行(
但是你所进行的操作可能已经按照通常的形式失败了)。
(助记:语法错误发生“在”哪里?)
(译注:符号“@”为英文单词“at”简写,意为“在……”)
警告消息不会被收集在该变量中。但你可以像后面描述的那样,通过设置
$SIG{__WARN__} 自己建立一个例程来处理警告。
另见 错误指示器。
$PROCESS_ID
$PID
$$ 运行本脚本的 Perl 的进程号。该变量应视为只读的,不过在 fork()
调用 时会被改变。(助记:和 shell 一样。)
Linux 用户注意:在 Linux 下, C 函数 "getpid()" 和 "getppid()"
对 不同的线程返回不同的值。为了可移植,该行为没有反映在 $$
里,该变量 的值在线程间保持不变。如果你想调用底层的
"getpid()",可以使用 CPAN 模块 "Linux::Pid"。
$REAL_USER_ID
$UID
$< 本进程的实际 uid。(助记:如果你用了 setuid,那么这是你原来的
uid。) 可以用 POSIX::setuid() 同时改变实际 uid 和有效
uid。由于改变 $< 需要 进行系统调用,在更改之后应检查 $!
以发现可能产生的错误。
$EFFECTIVE_USER_ID
$EUID
$> 本进程的有效 uid。例:
$< = $>; # set real to effective uid
($<,$>) = ($>,$<); # swap real and effective uid
可以用 POSIX::setuid() 同时改变有效 uid 和实际 uid。更改 $>
后需要 检查 $! 以发现可能产生的错误。
(助记:如果你用了 setuid,那么这是你要变成的 uid。) $< 和 $>
仅在支持 setreuid() 的机器上才能互换。
$REAL_GROUP_ID
$GID
$( 本进程的实际
gid。如果你使用的机器支持同时属于多个组,则该变量给出的是
被空格隔开的所在组列表。第一个数值是由 getgid()
返回的结果,后续的内容 是 getgroups()
返回的结果,其中可能有和第一个值相同的项。
然而为了设置实际 gid,赋给 $( 的必须是单个数值。因此从 $( 得到的
值在没有强制为数值(例如同零相加)的情况下*不应*再赋给 $(。
可以用 POSIX::setgid() 同时改变实际 gid 和有效 gid。更改 $(
后需要检查 $! 以便发现可能出现的错误。
(助记:圆括号用来将事物*分组*。当使用 setgid 时,实际 gid
是你*离开*的那个
组。)(译注:英文“离开”和“左”都是单词“left”。)
$EFFECTIVE_GROUP_ID
$EGID
$) 本进程的有效
gid。如果你使用的机器支持同时属于多个组,则该变量给出的是被
空格隔开的所在组列表。第一个数值为 getegid()
的返回值,后续的值是 getgroups()
的返回值,其中可能有和第一个值相同的项。
类似地,赋给 $)
的值也必须是一个空格隔开的数值列表。第一个数设置有效
gid,其余部分(若存在)则传给 setgroups()。要达到向 setgroups()
传递空列表 的效果,只需重复一遍新设置的有效 gid;例如,要将有效
gid 强制为 5 并向 setgroups() 传入空列表,就要这么写:" $) = "5
5" "。
可以用 POSIX::setgid() 同时改变有效 gid 和实际 gid
(只用单个数值参数)。 更改 $) 后需要对 $!
进行检查以便发现可能出现的错误。
(助记:圆括号用来*分组*事物。当使用 setgid 时,有效 gid
就是你需要的那个 组)(译注:原文为“that's *right* for
you”,难以表达“right”的含义。)
$<、$>、$( 和 $) 只能在支持对应的 *set[re][ug]id()*
例程的机器上进行设置。$( 和 $) 只能在支持 setregid()
的机器上互换。
$PROGRAM_NAME
$0 包含当前运行程序名。
在一些(注意:不是全部)操作系统下,向 $0 赋值可以改变 "ps"
程序所看到 的参数域。某些平台上你可能需要用特殊的 "ps"
选项或其他的 "ps" 才能看到 这个改变。修改 $0
作为指示当前程序状态的一种方法,要比用来隐藏你在运行的
程序更有用。(助记:同 sh 和 ksh 一样。)
注意 $0
的最大长度受相关平台的限制。多数极端情况下可能被限制在原始的 $0
所占据的空间之内。
在某些平台上可能会附加一些填充字符(例如空格)在 "ps"
显示出的修改名称
之后。有些平台上这种填充会充满原参数域,并且不受你的控制(例如
Linux 2.2)。
BSD 用户注意:设置 $0 不会完全把“perl”从 ps(1)
的输出中抹去。例如, 将 $0 设置为 "foobar" 可能产生 "perl:
foobar (perl)"("perl: " 前缀和 "
(perl)"后缀是否显示出来依赖于确切的 BSD
种类及版本)。这是操作系统 的一个特性,Perl 没法改变它。
在多线程脚本中 Perl
对所有线程等同视之,因此任何线程都能更改自己的 $0
副本,并且这一更改对 ps(1)
也是可见的(假设操作系统肯合作)。注意其他线程 所看到的 $0
不会被改变,因为它们有自己的副本。
$[ 数组第一个元素以及字符串中首个字符的索引号。默认为
0,但理论上你可以将其 设为 1 ,以使 Perl 在处理下标或对 index()
和 substr() 函数求值时表现得更 像 awk(或 Fortran)。(助记:[
代表下标开始。)
Perl 5 出现后,向 $[
赋值被当作一个编译器指示符,因此不会影响任何其他文件
的行为。(这就是为什么你只能赋给它编译期常量的原因。)
强烈建议不要使用该变量。
注意,不像其他编译期指示符(例如 strict),对 $[
的赋值对于同一文件的外层词法
作用域来说是可见的。然而你可以对其使用
local(),从而将它的值严格限定在单个词法 块之内。
$] Perl 解释器的版本 + 补丁级别 /
1000。该变量可用来判定一个脚本是否运行在恰当版本 范围的 Perl
解释器上。(助记:该版本的 Perl 是否是正确的类别?)(译注:英文
“right bracket”可以表示正确的类别,字面意思则是右方括号。)
例:
warn "No checksumming!\n" if $] < 3.019;
在运行的 Perl 解释器太老时导致失败的一种简便方法可参见 "use
VERSION" 和 "require VERSION" 的文档
为了避免浮点数的不精确性,在测试该变量时你可能更希望用不等测试
"<" 和 ">",而不是包含有相等的测试:"<="、"==" 和 ">="。
浮点数表示法有时会导致不精确的数值比较结果。另一种允许对 Perl
版本进行精确的字符串 比较的现代化表示法请见 $^V。
$COMPILING
$^C 同开关 -c 相关联的标志的当前值。主要用于
-MO=...,以允许代码在编译时改变自身 行为,例如在编译期处理
AUTOLOAD 而不是像平时那样延迟载入。见 perlcc。设置 "$^C = 1"
同调用 "B::minus_c" 类似。
$DEBUGGING
$^D 调试标志的当前值。(助记:-D
开关的值。)可以读取或设置。同它的命令行等价物类似,你
可以使用数值或符号值,例如 "$^D = 10" 和 "$^D = "st""。
$SYSTEM_FD_MAX
$^F 系统文件描述符最大数量,通常为 2。系统文件描述符会被传递到
exec() 出来的 进程里去,而数值高于它的文件描述符则不会。另外在
open() 时,若 open() 调用
失败系统文件描述符会保持不变。(普通文件描述符在尝试 open()
之前会被关闭。) 文件描述符的 exec
时关闭状态是根据对应的文件、管道或套接字打开时的 $^F
值来决定的,而不是 exec() 时的 $^F 值。
$^H 警告:该变量应严格限制在内部使用。其存在性、行为以及内容可能不经
提醒就被改 变。
该变量包含 Perl
解释器的编译期提示。在一个块编译结束时该变量会恢复到解释器开始
编译那个块时的值。
当 perl 开始解析任何提供了词法作用域的块构造时(例如 eval
体、require 的文件 、子程序体、循环体或条件块),$^H
的已有值会被保存下来,但不会发生变化。当 该块的编译完成时,$^H
恢复到保存的值。在保存和恢复其值的两点之间,BEGIN 块中
执行的代码可以任意改变 $^H 的值。
该行为提供了词法作用域语义,并被应用在像 "use strict"
指示符这样的地方。
其值应为一个整数;不同的位代表不同的指示标志。例如:
sub add_100 { $^H |= 0x100 }
sub foo {
BEGIN { add_100() }
bar->baz($boon);
}
考虑在 BEGIN 块执行过程中发生了什么。此时 BEGIN
块已经通过编译,而 foo() 函数体尚未完成编译。因此 $^H 的新值仅在
foo() 函数体编译时可见。
将上面的 BEGIN 块替换为:
BEGIN { require strict; strict->import('vars') }
即演示了 "use strict 'vars'"
是如何实现的。下面是同一词法指示符的一个条件化 版本:
BEGIN { require strict; strict->import('vars') if $condition }
%^H 警告:该变量应严格限定在内部使用。其存在性、行为以及内容可能不经
提醒就被改变。
%^H 散列表提供与 $^H
相同的作用域语法。这使其在实现词法作用域内的指示符时非常 有用。
$INPLACE_EDIT
$^I 原地编辑扩展的当前值。设置为 "undef" 时关闭原地编辑。(助记:-i
开关的值。)
$^M 默认情况下,内存耗尽是一个不可捕捉的致命错误。然而在适当编译的版
本中, Perl 可以将 $^M 的内容用作 die() 后的紧急内存池。假设你的
Perl 编译时使用 了 -DPERL_EMERGENCY_SBRK 选项以及 Perl 自己的
malloc。那么
$^M = 'a' x (1 << 16);
将会分配一个 64K
的缓冲区以备紧急情况时使用。如何打开该选项的相关信息请参见 Perl
发行版中的 INSTALL
文件。为了防止无意中使用这一高级特性,该变量没有 对应的 English
长名。
$OSNAME
$^O 为当前 Perl
副本编译时所处的操作系统名称,在配置过程中即确定。其值同
$Config{'osname'} 相同。另见 Config 及 perlrun 中说明的 -V
命令行开关。
在 Windows 平台下,$^O 并不十分有用:因为它总是
"MSWin32",而无法表示出 95/98/ME/NT/2000/XP/CE/.NET
之间的区别。请用 Win32::GetOSName() 或 Win32::GetOSVersion() (见
Win32 及 perlport) 区分这些变种。
${^OPEN}
由 PerlIO 使用的一个内部变量。是由 "\0"
字节分开的两部分组成的一个字符串,
前一部分描述输入层,后一部分描述输出层。
$PERLDB
$^P 供调试支持用的内部变量。其不同位所代表的意义很可能改变,但目前表
示的是:
0x01 进入/退出调试子程序。
0x02 逐行调试。
0x04 关闭优化。
0x08 为后续的交互检查预留更多数据。
0x10 保留子程序定义时所处源代码行的信息。
0x20 启动时打开单步调试。
0x40 报告时用子程序地址而不是名称。
0x80 还要报告 "goto &subroutine"。
0x100 根据编译的位置为 eval 提供表现内容较多的“文件”名。
0x200 根据编译的位置为匿名子程序提供表现内容较多的名称。
0x400 进入/退出调试断言子程序。
某些位仅同编译期相关,还有一些是运行期相关的。这是一种新机制,以
后可能 会修改其细节。
$LAST_REGEXP_CODE_RESULT
$^R 上一次成功的 "(?{ code })" 正则表达式断言(见 perlre)的求值结果。
可以被改写。
$EXCEPTIONS_BEING_CAUGHT
$^S 解释器当前状态。
$^S 状态
--------- -------------------
undef 解析模块/eval
true (1) 正在执行一个 eval
false (0) 其他
第一个状态也可能在 $SIG{__DIE__} 和 $SIG{__WARN__}
处理程序内产生。
$BASETIME
$^T 程序开始运行的时间,是从格林威治标准时刻(1970
年初)开始的秒数。由 -M 、-A 和 -C
文件测试所返回的结果是基于该值的。
${^TAINT}
反映污染模式是否打开。1 表示打开(程序用 -T 运行),0 表示关闭,-1
表示仅 打开了污染警告(即使用了 -t 或 -TU)。
${^UNICODE}
反映了 Perl 的确切 Unicode 设置。关于其可能值的更多信息请见
perlrun 文档 中对 "-C" 开关的描述。该变量在 Perl
启动时被设置,然后就是只读的了。
$PERL_VERSION
$^V Perl
解释器的修订号、版本号以及子版本号,由具有这些序数的字符组成的字
符串表示 。因此 Perl v5.6.0 中该变量等于 "chr(5) . chr(6) .
chr(0)" 且 "$^V eq v5.6.0"
会返回真值。注意该字符串值中的字符可能处于 Unicode 范围内。
该变量可用来确定某个脚本是否在正确版本范围内的 Perl
解释器上运行。(助记:用 ^V 进行版本控制。) 例如:
warn "No \"our\" declarations!\n" if $^V and $^V lt v5.6.0;
可以用 sprintf() 的 "%vd" 转换将 $^V 变成等价的字符串表达形式:
printf "version is v%vd\n", $^V; # Perl's version
关于在运行的 Perl 解释器过于古老时产生失败的方便方法,请参见
"use VERSION" 和 "require VERSION" 的文档。
较老的 Perl 版本表示法请见 $]。
$WARNING
$^W 警告开关的当前值,当使用 -w
时初始化为真,否则为假,不过可以直接修改。 (助记:同 -w
开关相关。) 另见 warnings。
${^WARNING_BITS}
当前由 "use warnings" 指示符打开的警告检查集合。更多细节参见
"warnings" 的 文档。
$EXECUTABLE_NAME
$^X 是用于执行当前 Perl 副本的名称,来自 C 的 "argv[0]"。
根据主机操作系统,$^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;
$this_perl = $^X;
if ($^O ne 'VMS')
{$this_perl .= $Config{_exe}
unless $this_perl =~ m/$Config{_exe}$/i;}
由于许多操作系统允许任何对 Perl
程序文件具有读权限的用户复制该文件、对其打
补丁并执行之,对安全敏感的 Perl 程序员应注意调用 perl
的安装副本而不是 $^X
引用的副本。下面的语句可以完成该目的,产生一个可以作为命令或当作
文件引用的 路径名。
use Config;
$secure_perl_path = $Config{perlpath};
if ($^O ne 'VMS')
{$secure_perl_path .= $Config{_exe}
unless $secure_perl_path =~ m/$Config{_exe}$/i;}
ARGV 对 @ARGV
里的命令行文件名进行迭代的特殊文件句柄。通常写为角操作符 "<>"
中的空文件句柄。注意目前 "ARGV" 仅在 "<>" 操作符内具有这一
特殊效果;在其他位置上它只是一个对应于 "<>"
打开的最后一个文件的普通 文件句柄。特别地,将 "\*ARGV"
作为参数传递给期望一个文件句柄的函数时, 函数不一定能自动读取
@ARGV 中所有文件的内容。
$ARGV 当读取 <> 时包含当前文件名。
@ARGV 数组 @ARGV 含有脚本的命令行参数。$#ARGV 通常是参数数量减 1,因为
$ARGV[0] 是第一个参数,而*不是*程序本身的命令名称。命令名称请见
$0。
ARGVOUT 用 -i
进行原地编辑处理时,这是指向当前打开的输出文件的特殊文件句柄。当
你需要进行 大量插入操作而不想一直修改 $_
时,该句柄相当有用。关于 -i 开关请参考 perlrun。
@F 当打开自动分割模式时,数组 @F 包含读入的一行所产生的域内容。关于
-a 开关请参考 perlrun。该数组是包内的特殊变量,当运行在 "strict
'vars'" 模式下且不处于 main 包
内时,必须对其进行声明或给出完整的包名。
@INC 数组 @INC 包含一个路径列表,"do EXPR"、"require" 和 "use"
结构都会在该列表中查找自己 所需的库文件。它的初始值由所有 -I
命令行开关的参数、默认 Perl 库目录(如 /usr/local/lib/perl)
和代表当前目录的“.”依次组合而成。(当使用 "-T" 或 "-t" 开启
污染检查开启时则不会把“.”附加在后面。)
若需要在运行时修改该变量,你应该使用 "use lib"
指示符,以便能正确载入平台相关的库:
use lib '/mypath/libdir/';
use SomeMod;
你还可以直接在 @INC 中放入 Perl
代码,以达到在文件包含系统中插入拦截点的目的。这些拦截点
可以是函数引用、数组引用或 bless 过的对象。细节请参考 "require"
in perlfunc
@_ 在某个函数内,数组 @_ 包含传递给该函数的所有参数。参见 perlsub。
%INC 散列表 %INC 含有若干项,每一项都代表由 "do"、"require" 和 "use"
运算符包含进来的一个
文件。散列键是包含处给定的文件名(模块名已转换为路径名),散列值为
找到该文件的位置。 "require"
运算符用这个散列表判断某个特定文件是否已经被包含过。
若某个文件是由拦截点(例如一个函数引用,这些拦截点的说明参见
"require" in perlfunc)载入的, 那么默认插入 %INC
的是这个拦截点而不是文件名。但要注意的是,拦截点可能已经自行修改
了 %INC 中的对应项以提供某些特别信息。
%ENV
$ENV{expr}
散列表 %ENV 含有当前的环境。对 "ENV" 设置值会改变后续 fork()
出来的所有子进程的环境。
%SIG
$SIG{expr}
散列表 %SIG 包含信号对应的处理器。例如:
sub handler { # 第一个参数是信号名称
my($sig) = @_;
print "Caught a SIG$sig--shutting down\n";
close(LOG);
exit(0);
}
$SIG{'INT'} = \&handler;
$SIG{'QUIT'} = \&handler;
...
$SIG{'INT'} = 'DEFAULT'; # 恢复默认行为
$SIG{'QUIT'} = 'IGNORE'; # 忽略 SIGQUIT
设置为 'IGNORE' 值通常具有忽略该信号的效果,除了 "CHLD"
信号以外。对于这一特殊情况 的详细说明请见 perlipc。
下面是其他一些例子:
$SIG{"PIPE"} = "Plumber"; # 假定为 main::Plumber (不推荐)
$SIG{"PIPE"} = \&Plumber; # 挺好;假定为当前的 Plumber
$SIG{"PIPE"} = *Plumber; # 有点儿深奥
$SIG{"PIPE"} = Plumber(); # 啊!Plumber() 返回的是什么?
请确保没有使用裸字作为一个信号处理器的名字,免得产生无意中的调用
。
如果系统有 sigaction()
函数,就用它来安装信号处理器。这意味着你能得到可靠的信号处理方式
。
默认的信号投递策略在 Perl 5.8.0
中从立即发送(也即“不安全”)改为了延迟发送,即“安全信号”
。更多信息请见 perlipc。
用 %SIG
散列表也可以设置特定的内部拦截点。在即将打印一条警告信息时,由
$SIG{__WARN__}
指定的例程会被调用。警告信息作为第一个参数被传递给该例程。__WARN
__ 拦截点的存在会消除通常 要打印到 STDERR
上的警告。你可以利用这一点将警告保存到变量里,或者像这样将警告转
变为致命错误:
local $SIG{__WARN__} = sub { die $_[0] };
eval $proggie;
当即将抛出一个致命异常时,由 $SIG{__DIE__}
指定的例程会被调用。错误信息作为第一个参数被 传递给该例程。当
__DIE__
拦截例程返回后,异常处理会像拦截点不存在一样继续进行,除非拦截例
程 本身通过 "goto"、循环退出或 die() 的方式结束。"__DIE__"
处理器在调用过程中被显式关闭,因此 你可以在 "__DIE__"
处理器中继续 die。"__WARN__" 也具有类似行为。
由于一个实现的小问题,$SIG{__DIE__} 拦截点即使在 eval()
内也会被调用。请不要利用这一点复盖 $@
中挂起的异常或莫名其妙地重载
CORE::GLOBAL::die()。这一奇特行为在将来应该会被修正为只在
程序即将退出时调用
$SIG{__DIE__},这也是最初的目的。不应采用任何其他形式的用法。
"__DIE__"/"__WARN__" 处理器在一种情况下是很特殊的:
它们可能会在汇报解析器发现的(可能)错误时被调用。在这种情况下解析
器可能处于不一致的状态,任何从 这类处理器中 eval Perl
代码的尝试都可能导致段错误。这意味着处理解析 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...
To see backtrace try starting Perl with -MCarp switch";
这里的第一行只有在调用处理器的对象*不是*解析器时才会执行载入操作
。第二行只有在 Carp 可用时才打印
出回溯信息并退出程序。第三行则仅在 Carp 不可用时才会运行。
额外信息请见 "die" in perlfunc、"warn" in perlfunc、"eval" in
perlfunc 和 warnings。
错误指示器
变量 $@、$!、$^E 和 $?
含有关于不同类型错误条件的信息,这些错误可能在执行一个 Perl
程序时产生。这些变量按照到 Perl
进程和错误报告子系统的“距离”远近排列顺序,它们分别对应由 Perl
解释器、C 库、操作系统和外部程序检测到的错误。
为了展示这些变量之间的区别,请考虑以下这个使用了单引号引起字符串的 Perl
表达式:
eval q{
open my $pipe, "/cdrom/install |" or die $!;
my @res = <$pipe>;
close $pipe or die "bad pipe: $?, $!";
};
当这条语句执行之后,4 个变量都有可能被设置。
在需要 "eval" 的字符串没有通过编译(若 "open" 或 "close"
导入的原型错误则可能发生)或者 Perl 代码在执行过程中 die() 掉,则 $@
变量会被设置。这些情况下 $@ 的值是编译错误信息或 "die" 的
参数(其中会内插 $! 和 $?)。(另见 Fatal。)
上面的 eval() 表达式执行后,open()、"
" 和 "close" 被翻译成对 C
运行库的调用,继而 进入操作系统内核。若其中某个调用失败,则 $! 会设置为
C 库的 "errno" 值。
在少数操作系统下,$^E 可能含有更详细的错误指示,例如“CDROM
仓门没有关闭”。不支持扩展错误 信息的系统只是将 $^E 设置为和 $!
一样的值。
最后,$? 在外部程序 /cdrom/install 失败时设置为非 0 值。高 8
位反映出该程序遇到的特定错误 条件(程序的 exit() 值),低 8
位反映失败方式,例如信号致死或核心转储,细节参见 wait(2)。对比
仅在检测到错误条件时才设置的 $! 和 $^E,变量 $? 在每个 "wait" 或管道
"close" 时都会 设置并冲掉旧值。这一行为更接近 $@,后者在每次 eval()
后总是在失败时设置并在成功时清除。
更多细节请分别参见 $@、$!、$^E 和 $? 各自的说明。
关于变量名语法的技术事项
Perl
中的变量名可以有多种格式。通常,它们要以下划线或字母开头,这种情况下变量
名可以任意长(但有 251
个字符的内部限制)且可包含字母、数字、下划线或特殊序列 "::" 和
"'"。最后一个 "::" 或 "'" 之前的 部分被当作*包限定符*;参见 perlmod。
Perl 变量名也可以是一串数字、单个标点或控制符。这些名字都被 Perl
保留用作特殊用途;例如,全数字的
名字用来在正则表达式匹配之后保存反向引用捕获的数据。Perl
对单个控制符的名字具有一套特殊语法:它将 "^X" (脱字符后跟 "X") 理解为
Ctrl-"X" 字符。例如,记法 $^W (美元符 脱字符 "W") 是一个名字 为单个字符
Ctrl-"W" 的标量变量。这要比在程序里键入一个字面上的 Ctrl-"W" 好一些。
最后,在 Perl 5.6 中引入了一个新特性,Perl
变量名可以是以控制符(更进一步,也可以是脱字符)开头的字母
数字字符串。这些变量必须写成 "${^Foo}" 的形式;大括号是必需的。"${^Foo}"
代表了一个名字是 Ctrl-"F" 后跟两个 "o" 的标量。这些变量被 Perl
保留作将来的特殊用途,但以 "^_" (Ctrl-下划线或
脱字符-下划线)开头的那些除外。以 "^_" 开头的名字将不会在 Perl
的未来版本中产生任何特殊含义;因而 可以在程序中安全使用这类名字。但 $^_
本身*是*保留的。
以数字、控制符或标点字符开头的 Perl 标识符不受 "package"
声明的影响,它们始终被强制在 "main" 包里; 另外它们也不受 "strict
'vars'" 错误的约束。其他一小部分名字也具有同样的豁免权:
ENV STDIN
INC STDOUT
ARGV STDERR
ARGVOUT _
SIG
特别地,不管当前作用域中的 "package" 声明如何,新形式的特殊变量
"${^_XYZ}" 总是被放置在 "main" 包里。
BUGS
由于 Perl 实现时一个不幸的事故,"use English"
会使程序中所有正则表达式匹配产生显著的效率降低,不管它们 是否出现在 "use
English" 的作用域里。因此,强烈不推荐在库里使用 "use
English"。更多信息请参见 CPAN 上的 Devel::SawAmpersand 模块文档 (
)。
在异常处理器中不应该考虑 $^S。$SIG{__DIE__}
的当前实现令人伤心,很难用它跟踪错误。请避免使用它并 用 "END{}" 或
CORE::GLOBAL::die 重载来代替之。
TRANSLATORS
ChaosLawful