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
广告