perl 特殊变量
翻译自:perldoc.perl.org
== 常用变量 ==
$ARG
$_
默认模式搜索变量
下列函数使用它作为默认参数:
abs, alarm, chomp, chop, chr, chroot, cos, defined, eval, exp, glob, hex, int, lc, lcfirst,
length, log, lstat, mkdir, oct, ord, pos, print, quotemeta, readlink, readpipe, ref, require,
reverse (in scalar context only), rmdir, sin, split (on its second argument), sqrt, stat,
study, uc, ucfirst, unlink, unpack.
用于文件测试 (-f, -d)
用于模式匹配操作 m//, s/// 和 tr// (又名 y///)
用于 foreach, grep, map
用于 given 语句
@ARG
@_
对于函数来说,@_ 包含了传递给该函数的参数。在函数中,@_ 是 push, pop, shift, unshift 的默认参数。
$LIST_SEPARATOR
$"
当一个数组被引用在 "" 中或者 // 中。数组的值变为所有元素被 $" 连接起来的值。
$" 默认值为空格。
$PROCESS_ID
$PID
$$
运行 perl 脚本的当前进程的 pid 值。等同于 getpid()。
$REAL_GROUP_ID
$GID
$(
该进程的 real gid 。由 getgid() 获得。
如果运行在一个支持用户同时属于多个组的操作系统上,$( 将返回由空格分隔的多个 gid。由 getgroups() 获得。
只能给 $( 赋予单个整数。
$EFFECTIVE_GROUP_ID
$EGID
$)
该进程的 effective gid。
$PROGRAM_NAME
$0
当前程序的名字。
$SUBSCRIPT_SEPARATOR
$SUBSEP
$;
如果这样访问一个哈系表:
%ENV
存放环境变量哈希表。
@F
当指定了 -a 参数的时候,@F 中保存着每一行被分隔后的数组:
$OSNAME
$^O
当前操作系统的名字。
%SIG
哈希 %SIG 中保存了信号的处理函数。例子如下:
下面是指定处理函数的其他方式:
warning 消息的内容为函数的第一个参数。
$BASETIME
$^T
程序开始运行的时间(时间戳)
$PERL_VERSION
$^V
perl 的版本号
== 和正则表达式相关的变量 ==
$<digits> ($1, $2, ...)
匹配中 () 匹配的部分。
$&
$MATCH
前一次成功匹配的字符串。
$`
$PREMATCH
位于前一次成功匹配字符串前面的字符串。
$'
$POSTMATCH
位于前一次成功匹配字符串后面的字符串。
$LAST_PAREN_MATCH
$+
前一次成功匹配中最后一个 () 中的内容。
@LAST_MATCH_END
@+
前一次成功匹配中每个 () 匹配的偏移量。
$+[0] 为整个匹配末尾的偏移量
$+[1] 为 $1 末尾的偏移量
$+[2] 为 $2 末尾的偏移量
...
$#+ 为前一次成功匹配的 () 数量
%LAST_PAREN_MATCH
%+
前一次成功匹配中命名匹配(即为 (?<name>...) 的形式)的哈系表。
如:
另外一个例子:
@LAST_MATCH_START
@-
和 @+ 类似:
$-[0] 为整个匹配头部的偏移量
$-[1] 为 $1 头部的偏移量
$-[2] 为 $2 头部的偏移量
...
$` 等同于 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])
%LAST_MATCH_START
%-
类似于 %+,通过 %- 可以访问到上一次成功匹配中所有的命名匹配。
每个命名匹配的名字都与一个数组相关联。
比如说:
== 和文件句柄相关的变量 ==
$ARGV
<> 中正在被读取的文件的名字
例子:
@ARGV
命令行参数,$ARGV[0] 代表第一个参数(而不是程序的名字)。
$OUTPUT_FIELD_SEPARATOR
$OFS
$,
print 函数的输出分隔符,默认值为 undef。
例子:
$INPUT_LINE_NUMBER
$NR
$.
上一次读取文件的行号。
$. 在文件句柄关闭的时候重置。
由于 <> 操作符不会关闭文件,因此在连续从 ARGV 读取文件的时候,$. 会不断增加。
例子:
$INPUT_RECORD_SEPARATOR
$RS
$/
类似于 awk 的 RS 变量。它决定了 perl 如何分割行。
例子:
$OUTPUT_RECORD_SEPARATOR
$ORS
$\
print 函数输出的分隔符。默认值为 undef,如果定义了,则在 print 完所有参数后输出 $\。
例子:
$OUTPUT_AUTOFLUSH
$|
如果设置为非0的值,将强制的 flush 当前 selected 的文件句柄。
(类似于 setbuf(xx, NULL) ?)
== 和错误信息有关的变量 ==
$ERRNO
$!
等同于 libc 中的 errno。可以转换为 int 和 string 两种形式:
$CHILD_ERROR
$?
类似于 shell 中的 $?。可以为下列操作的返回值:
- 最后一次管道关闭
- `` 或者 system() 语句
- wait() 或者 waitpid()
$? >> 8 为子进程的返回值
$EVAL_ERROR
$@
上一次 eval() 操作的语法错误信息。
例子:
== 常用变量 ==
$ARG
$_
默认模式搜索变量
下列函数使用它作为默认参数:
abs, alarm, chomp, chop, chr, chroot, cos, defined, eval, exp, glob, hex, int, lc, lcfirst,
length, log, lstat, mkdir, oct, ord, pos, print, quotemeta, readlink, readpipe, ref, require,
reverse (in scalar context only), rmdir, sin, split (on its second argument), sqrt, stat,
study, uc, ucfirst, unlink, unpack.
用于文件测试 (-f, -d)
用于模式匹配操作 m//, s/// 和 tr// (又名 y///)
用于 foreach, grep, map
用于 given 语句
@ARG
@_
对于函数来说,@_ 包含了传递给该函数的参数。在函数中,@_ 是 push, pop, shift, unshift 的默认参数。
$LIST_SEPARATOR
$"
当一个数组被引用在 "" 中或者 // 中。数组的值变为所有元素被 $" 连接起来的值。
$" 默认值为空格。
print "The array is: @array\n"; print "The array is: " . join($", @array) . "\n";它们是相等的。
@a = (1, 3, 4); print "@a\n"; $" = ","; print "@a\n"; print "1,3,4" =~ /@a/;输出为
1 3 4 1,3,4 1
$PROCESS_ID
$PID
$$
运行 perl 脚本的当前进程的 pid 值。等同于 getpid()。
$REAL_GROUP_ID
$GID
$(
该进程的 real gid 。由 getgid() 获得。
如果运行在一个支持用户同时属于多个组的操作系统上,$( 将返回由空格分隔的多个 gid。由 getgroups() 获得。
只能给 $( 赋予单个整数。
$EFFECTIVE_GROUP_ID
$EGID
$)
该进程的 effective gid。
$< = $>; # set real to effective uid ($<,$>) = ($>,$<); # swap real and effective uids
$PROGRAM_NAME
$0
当前程序的名字。
$SUBSCRIPT_SEPARATOR
$SUBSEP
$;
如果这样访问一个哈系表:
$foo{$a,$b,$c}等同于:
$foo{join($;, $a, $b, $c)}例子:
%h = ('123', 'test'); $; = ''; print $h{1,2,3}; # 输出 test
%ENV
存放环境变量哈希表。
@F
当指定了 -a 参数的时候,@F 中保存着每一行被分隔后的数组:
perl -ane 'print pop(@F), "\n";'等同于
while (<>) { @F = split(' '); print pop(@F), "\n"; }
$OSNAME
$^O
当前操作系统的名字。
# perl -e "print $^O" # linux
%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 信号。
下面是指定处理函数的其他方式:
$SIG{"PIPE"} = "Plumber"; # 指定为 main::Plumber (不推荐) $SIG{"PIPE"} = \&Plumber; # 推荐的方式 $SIG{"PIPE"} = *Plumber; # 有点奇怪 $SIG{"PIPE"} = Plumber(); # 错误的做法,Plumber() 会返回什么??部分内部的 hook 也可以通过设置 SIG 来指定。比如说:
local $SIG{__WARN__} = sub { die $_[0] }; eval $proggie;当一个 warning 被抛出的时候,$SIG{__WARN__} 所指向的函数将被调用。
warning 消息的内容为函数的第一个参数。
$BASETIME
$^T
程序开始运行的时间(时间戳)
# perl -e "print $^T" 1314234806
$PERL_VERSION
$^V
perl 的版本号
warn "Hashes not randomized!\n" if !$^V or $^V lt v5.8.1
== 和正则表达式相关的变量 ==
$<digits> ($1, $2, ...)
匹配中 () 匹配的部分。
$&
$MATCH
前一次成功匹配的字符串。
$`
$PREMATCH
位于前一次成功匹配字符串前面的字符串。
$'
$POSTMATCH
位于前一次成功匹配字符串后面的字符串。
local $_ = 'abcdefghi'; /def/; print "$`:$&:$'\n"; # 输出 abc:def:ghi
$LAST_PAREN_MATCH
$+
前一次成功匹配中最后一个 () 中的内容。
/Version: (.*)|Revision: (.*)/ && ($rev = $+);
@LAST_MATCH_END
@+
前一次成功匹配中每个 () 匹配的偏移量。
$+[0] 为整个匹配末尾的偏移量
$+[1] 为 $1 末尾的偏移量
$+[2] 为 $2 末尾的偏移量
...
$#+ 为前一次成功匹配的 () 数量
%LAST_PAREN_MATCH
%+
前一次成功匹配中命名匹配(即为 (?<name>...) 的形式)的哈系表。
如:
'foo' =~ /(?<foo>foo)/; # $+{foo} 和 $1 中都存放着 'foo'
另外一个例子:
$_ = "testing1234end"; /^testing(.)(.)(..)end/; print "@+"; # 输出 14 8 9 11 /^(?<foo>[a-z]+)(?<num>\d+)/; print "$+{foo}"; # 输出 testing print "$+{num}"; # 输出 1234
@LAST_MATCH_START
@-
和 @+ 类似:
$-[0] 为整个匹配头部的偏移量
$-[1] 为 $1 头部的偏移量
$-[2] 为 $2 头部的偏移量
...
$` 等同于 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])
%LAST_MATCH_START
%-
类似于 %+,通过 %- 可以访问到上一次成功匹配中所有的命名匹配。
每个命名匹配的名字都与一个数组相关联。
比如说:
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'
== 和文件句柄相关的变量 ==
$ARGV
<> 中正在被读取的文件的名字
例子:
# cat c 1 2 # cat d 1 2 3 4 # cat a.pl while (<>) { print "$ARGV\n"; } # perl a.pl c d c c d d d d
@ARGV
命令行参数,$ARGV[0] 代表第一个参数(而不是程序的名字)。
$OUTPUT_FIELD_SEPARATOR
$OFS
$,
print 函数的输出分隔符,默认值为 undef。
例子:
print "a", "c"; # 输出 ac $, = "|"; print "a", "c"; # 输出 a|c
$INPUT_LINE_NUMBER
$NR
$.
上一次读取文件的行号。
$. 在文件句柄关闭的时候重置。
由于 <> 操作符不会关闭文件,因此在连续从 ARGV 读取文件的时候,$. 会不断增加。
例子:
# cat a.pl while (<>) { print "$.\n"; } # perl a.pl c d 1 2 3 4 5 6其中 c d 的长度分别为 2, 4 行。
$INPUT_RECORD_SEPARATOR
$RS
$/
类似于 awk 的 RS 变量。它决定了 perl 如何分割行。
例子:
# cat c 1|2|3 # cat a.pl $/ = "|"; while (<>) { print "line:$_\n"; } # perl a.pl c line:1| line:2| line:3
$OUTPUT_RECORD_SEPARATOR
$ORS
$\
print 函数输出的分隔符。默认值为 undef,如果定义了,则在 print 完所有参数后输出 $\。
例子:
$\ = "|"; print "a"; print "b"; # 将输出 a|b|
$OUTPUT_AUTOFLUSH
$|
如果设置为非0的值,将强制的 flush 当前 selected 的文件句柄。
(类似于 setbuf(xx, NULL) ?)
== 和错误信息有关的变量 ==
$ERRNO
$!
等同于 libc 中的 errno。可以转换为 int 和 string 两种形式:
open '/a'; print int($!) . ": $!\n"; # 输出 2: 没有那个文件或目录
$CHILD_ERROR
$?
类似于 shell 中的 $?。可以为下列操作的返回值:
- 最后一次管道关闭
- `` 或者 system() 语句
- wait() 或者 waitpid()
$? >> 8 为子进程的返回值
$EVAL_ERROR
$@
上一次 eval() 操作的语法错误信息。
例子:
# cat a.pl eval "my a"; print "$@"; # perl a.pl No such class a at (eval 1) line 1, near "my a" syntax error at (eval 1) line 2, at EOF