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 | |
| $. | 最后读取的文件句柄的当前输入行号。对文件句柄显式调用 close 会重置行号。 |
| $NR | |
| $/ | 输入记录分隔符;默认为换行符。如果设置为 null 字符串,则将空行视为分隔符。 |
| $RS | |
| $, | print 操作符的输出字段分隔符。 |
| $OFS | |
| $\ | print 操作符的输出记录分隔符。 |
| $ORS | |
| $" | 类似于 "$,",但适用于插值到双引号字符串(或类似解释字符串)中的列表值。默认为空格。 |
| $LIST_SEPARATOR | |
| $; | 多维数组仿真的下标分隔符。默认为 "\034"。 |
| $SUBSCRIPT_SEPARATOR | |
| $^L | format 输出换页符的内容。默认为 "\f"。 |
| $FORMAT_FORMFEED | |
| $: | format 中续行字段(以 ^ 开头)后字符串可以断开的当前字符集。默认为 "\n-"。 |
| $FORMAT_LINE_BREAK_CHARACTERS | |
| $^A | format 行的当前写入累加器值。 |
| $ACCUMULATOR | |
| $# | 打印数字的输出格式(已弃用)。 |
| $OFMT | |
| $? | 最后一次管道关闭、反引号 (``) 命令或 system 操作符返回的状态。 |
| $CHILD_ERROR | |
| $! | 在数值上下文中使用时,返回 errno 变量的当前值,标识最后一次系统调用错误。在字符串上下文中使用时,返回对应的系统错误字符串。 |
| $OS_ERROR or $ERRNO | |
| $@ | 最后一次 eval 命令的 Perl 语法错误消息。 |
| $EVAL_ERROR | |
| $$ | 运行此脚本的 Perl 进程的 pid。 |
| $PROCESS_ID or $PID | |
| $< | 此进程的真实用户 ID (uid)。 |
| $REAL_USER_ID or $UID | |
| $> | 此进程的有效用户 ID。 |
| $EFFECTIVE_USER_ID or $EUID | |
| $( | 此进程的真实组 ID (gid)。 |
| $REAL_GROUP_ID or $GID | |
| $) | 此进程的有效 gid。 |
| $EFFECTIVE_GROUP_ID or $EGID | |
| $0 | 包含正在执行的 Perl 脚本所在文件的名称。 |
| $PROGRAM_NAME | |
| $[ | 数组中第一个元素的索引以及子字符串中第一个字符的索引。默认为 0。 |
| $] | 返回版本号加上 patchlevel 除以 1000。 |
| $PERL_VERSION | |
| $^D | 当前调试标志的值。 |
| $DEBUGGING | |
| $^E | 某些平台上的扩展错误消息。 |
| $EXTENDED_OS_ERROR | |
| $^F | 最大系统文件描述符,通常为 2。 |
| $SYSTEM_FD_MAX | |
| $^H | 包含由某些实用模块启用的内部编译器提示。 |
| $^I | 就地编辑扩展的当前值。使用 undef 禁用就地编辑。 |
| $INPLACE_EDIT | |
| $^M | $M 的内容可以在 Perl 因内存不足错误而崩溃时用作紧急内存池。使用 $M 需要 Perl 的特殊编译。有关更多信息,请参阅 INSTALL 文档。 |
| $^O | 包含当前 Perl 二进制文件编译所针对的操作系统的名称。 |
| $OSNAME | |
| $^P | 调试器清除的内部标志,以避免调试自身。 |
| $PERLDB | |
| $^T | 脚本开始运行的时间,以自 epoch 以来的秒数计算。 |
| $BASETIME | |
| $^W | 警告开关的当前值,为 true 或 false。 |
| $WARNING | |
| $^X | Perl 二进制文件自身执行时的名称。 |
| $EXECUTABLE_NAME | |
| $ARGV | 从 <ARGV> 读取时包含当前文件的名称。 |
全局数组特殊变量
| @ARGV | 包含脚本的命令行参数的数组。 |
| @INC | 包含 do、require 或 use 构造要评估的 Perl 脚本的搜索位置列表的数组。 |
| @F | 当给出 -a 命令行开关时,输入行被拆分到此数组中。 |
全局 Hash 特殊变量
| %INC | 该 hash 包含通过 do 或 require 包含的每个文件的文件名条目。 |
| %ENV | 包含当前环境的 hash。 |
| %SIG | 用于为各种信号设置信号处理器的 hash。 |
全局特殊文件句柄
| ARGV | 迭代命令行文件名 @ARGV 中的特殊文件句柄。通常以空文件句柄 <> 的形式书写。 |
| STDERR | 任何包中的标准错误特殊文件句柄。 |
| STDIN | 任何包中的标准输入特殊文件句柄。 |
| STDOUT | 任何包中的标准输出特殊文件句柄。 |
| DATA | 指向脚本所在文件中 __END__ 标记之后内容的特殊文件句柄。或者,在 required 文件中指向 __DATA__ 标记之后内容的特殊文件句柄,前提是在找到 __DATA__ 的同一包中读取数据。 |
| _ (underscore) | 用于缓存最后一次 stat、lstat 或文件测试操作符信息的特殊文件句柄。 |
全局特殊常量
| __END__ | 表示程序的逻辑结束。后续任何文本将被忽略,但可以通过 DATA 文件句柄读取。 |
| __FILE__ | 表示程序中使用它的位置的文件名。不插值到字符串中。 |
| __LINE__ | 表示当前行号。不插值到字符串中。 |
| __PACKAGE__ | 表示编译时当前包名,如果没有当前包则未定义。不插值到字符串中。 |
正则表达式特殊变量
| $digit | 包含上次匹配的模式中对应括号组匹配的文本。例如,$1 匹配前一个正则表达式中第一个括号组的内容。 |
| $& | 上次成功模式匹配的字符串。 |
| $MATCH | |
| $` | 上次成功模式匹配之前的前导字符串。 |
| $PREMATCH | |
| $' | 上次成功模式匹配之后的后续字符串。 |
| $POSTMATCH | |
| $+ | 上次搜索模式匹配的最后一个括号。这在不知道一组备选模式中哪个被匹配时很有用。例如:/Version: (.*)|Revision: (.*)/ && ($rev = $+); |
| $LAST_PAREN_MATCH |
文件句柄特殊变量
| $| | 如果设置为非零值,则在当前选定输出通道的每次 write 或 print 后强制执行 fflush(3)。 |
| $OUTPUT_AUTOFLUSH | |
| $% | 当前选定输出通道的当前页码。 |
| $FORMAT_PAGE_NUMBER | |
| $= | 当前选定输出通道的当前页长度(可打印行数)。默认为 60。 |
| $FORMAT_LINES_PER_PAGE | |
| $- | 当前选定输出通道页面剩余行数。 |
| $FORMAT_LINES_LEFT | |
| $~ | 当前选定输出通道的当前报告格式名称。默认为文件句柄的名称。 |
| $FORMAT_NAME | |
| $^ | 当前选定输出通道的当前页眉格式名称。默认为文件句柄名称后附加 _TOP。 |
| $FORMAT_TOP_NAME |