翻譯自:perldoc.perl.org
== 常用變量 ==
$ARG
$_
默認(rèn)模式搜索變量
下列函數(shù)使用它作為默認(rèn)參數(shù):
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.
用于文件測(cè)試 (-f, -d)
用于模式匹配操作 m//, s/// 和 tr// (又名 y///)
用于 foreach, grep, map
用于 given 語(yǔ)句
@ARG
@_
對(duì)于函數(shù)來(lái)說(shuō),@_ 包含了傳遞給該函數(shù)的參數(shù)。在函數(shù)中,@_ 是 push, pop, shift, unshift 的默認(rèn)參數(shù)。
$LIST_SEPARATOR
$"
當(dāng)一個(gè)數(shù)組被引用在 "" 中或者 // 中。數(shù)組的值變?yōu)樗性乇?$" 連接起來(lái)的值。
$" 默認(rèn)值為空格。
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
$$
運(yùn)行 perl 腳本的當(dāng)前進(jìn)程的 pid 值。等同于 getpid()。
$REAL_GROUP_ID
$GID
$(
該進(jìn)程的 real gid 。由 getgid() 獲得。
如果運(yùn)行在一個(gè)支持用戶同時(shí)屬于多個(gè)組的操作系統(tǒng)上,$( 將返回由空格分隔的多個(gè) gid。由 getgroups() 獲得。
只能給 $( 賦予單個(gè)整數(shù)。
$EFFECTIVE_GROUP_ID
$EGID
$)
該進(jìn)程的 effective gid。
$< = $>; # set real to effective uid
($<,$>) = ($>,$<); # swap real and effective uids
$PROGRAM_NAME
$0
當(dāng)前程序的名字。
$SUBSCRIPT_SEPARATOR
$SUBSEP
$;
如果這樣訪問(wèn)一個(gè)哈系表:
$foo{$a,$b,$c}
等同于:
$foo{join($;, $a, $b, $c)}
例子:
%h = ('123', 'test');
$; = '';
print $h{1,2,3}; # 輸出 test
%ENV
存放環(huán)境變量哈希表。
@F
當(dāng)指定了 -a 參數(shù)的時(shí)候,@F 中保存著每一行被分隔后的數(shù)組:
perl -ane 'print pop(@F), "\n";'
等同于
while (<>) {
@F = split(' ');
print pop(@F), "\n";
}
$OSNAME
$^O
當(dāng)前操作系統(tǒng)的名字。
# perl -e "print $^O"
# linux
%SIG
哈希 %SIG 中保存了信號(hào)的處理函數(shù)。例子如下:
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' 則忽略該信號(hào),除了 CHLD 信號(hào)。
下面是指定處理函數(shù)的其他方式:
$SIG{"PIPE"} = "Plumber"; # 指定為 main::Plumber (不推薦)
$SIG{"PIPE"} = \&Plumber; # 推薦的方式
$SIG{"PIPE"} = *Plumber; # 有點(diǎn)奇怪
$SIG{"PIPE"} = Plumber(); # 錯(cuò)誤的做法,Plumber() 會(huì)返回什么??
部分內(nèi)部的 hook 也可以通過(guò)設(shè)置 SIG 來(lái)指定。比如說(shuō):
local $SIG{__WARN__} = sub { die $_[0] };
eval $proggie;
當(dāng)一個(gè) warning 被拋出的時(shí)候,$SIG{__WARN__} 所指向的函數(shù)將被調(diào)用。
warning 消息的內(nèi)容為函數(shù)的第一個(gè)參數(shù)。
$BASETIME
$^T
程序開始運(yùn)行的時(shí)間(時(shí)間戳)
# perl -e "print $^T"
1314234806
$PERL_VERSION
$^V
perl 的版本號(hào)
warn "Hashes not randomized!\n" if !$^V or $^V lt v5.8.1
== 和正則表達(dá)式相關(guān)的變量 ==
$<digits> ($1, $2, ...)
匹配中 () 匹配的部分。
$&
$MATCH
前一次成功匹配的字符串。
$`
$PREMATCH
位于前一次成功匹配字符串前面的字符串。
$'
$POSTMATCH
位于前一次成功匹配字符串后面的字符串。
local $_ = 'abcdefghi';
/def/;
print "$`:$&:$'\n"; # 輸出 abc:def:ghi
$LAST_PAREN_MATCH
$+
前一次成功匹配中最后一個(gè) () 中的內(nèi)容。
/Version: (.*)|Revision: (.*)/ && ($rev = $+);
@LAST_MATCH_END
@+
前一次成功匹配中每個(gè) () 匹配的偏移量。
$+[0] 為整個(gè)匹配末尾的偏移量
$+[1] 為 $1 末尾的偏移量
$+[2] 為 $2 末尾的偏移量
...
$#+ 為前一次成功匹配的 () 數(shù)量
%LAST_PAREN_MATCH
%+
前一次成功匹配中命名匹配(即為 (?<name>...) 的形式)的哈系表。
如:
'foo' =~ /(?<foo>foo)/; # $+{foo} 和 $1 中都存放著 'foo'
另外一個(gè)例子:
$_ = "testing1234end";
/^testing(.)(.)(..)end/;
print "@+"; # 輸出 14 8 9 11
/^(?<foo>[a-z]+)(?<num>\d+)/;
print "$+{foo}"; # 輸出 testing
print "$+{num}"; # 輸出 1234
@LAST_MATCH_START
@-
和 @+ 類似:
$-[0] 為整個(gè)匹配頭部的偏移量
$-[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
%-
類似于 %+,通過(guò) %- 可以訪問(wèn)到上一次成功匹配中所有的命名匹配。
每個(gè)命名匹配的名字都與一個(gè)數(shù)組相關(guān)聯(lián)。
比如說(shuō):
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";
}
}
}
會(huì)輸出:
$-{A}[0] : '1'
$-{A}[1] : '3'
$-{B}[0] : '2'
$-{B}[1] : '4'
== 和文件句柄相關(guān)的變量 ==
$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
命令行參數(shù),$ARGV[0] 代表第一個(gè)參數(shù)(而不是程序的名字)。
$OUTPUT_FIELD_SEPARATOR
$OFS
$,
print 函數(shù)的輸出分隔符,默認(rèn)值為 undef。
例子:
print "a", "c"; # 輸出 ac
$, = "|";
print "a", "c"; # 輸出 a|c
$INPUT_LINE_NUMBER
$NR
$.
上一次讀取文件的行號(hào)。
$. 在文件句柄關(guān)閉的時(shí)候重置。
由于 <> 操作符不會(huì)關(guān)閉文件,因此在連續(xù)從 ARGV 讀取文件的時(shí)候,$. 會(huì)不斷增加。
例子:
# cat a.pl
while (<>) {
print "$.\n";
}
# perl a.pl c d
1
2
3
4
5
6
其中 c d 的長(zhǎng)度分別為 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 函數(shù)輸出的分隔符。默認(rèn)值為 undef,如果定義了,則在 print 完所有參數(shù)后輸出 $\。
例子:
$\ = "|";
print "a";
print "b";
# 將輸出 a|b|
$OUTPUT_AUTOFLUSH
$|
如果設(shè)置為非0的值,將強(qiáng)制的 flush 當(dāng)前 selected 的文件句柄。
(類似于 setbuf(xx, NULL) ?)
== 和錯(cuò)誤信息有關(guān)的變量 ==
$ERRNO
$!
等同于 libc 中的 errno??梢赞D(zhuǎn)換為 int 和 string 兩種形式:
open '/a';
print int($!) . ": $!\n"; # 輸出 2: 沒有那個(gè)文件或目錄
$CHILD_ERROR
$?
類似于 shell 中的 $???梢詾橄铝胁僮鞯姆祷刂担?/br>
- 最后一次管道關(guān)閉
- `` 或者 system() 語(yǔ)句
- wait() 或者 waitpid()
$? >> 8 為子進(jìn)程的返回值
$EVAL_ERROR
$@
上一次 eval() 操作的語(yǔ)法錯(cuò)誤信息。
例子:
# 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