他的END区块中的Stackoverflower
tried to use
@ARGV
同伴但无法进行.
为什么@ARGV仅在BEGIN块中定义,具有以下单行:
$perl -lne 'BEGIN{ print "BEGIN" if @ARGV } print "MIDDLE" if @ARGV } { print "END" if @ARGV ' file BEGIN
perldoc perlrun
对此事没有任何启示.这里发生了什么?
解决方法
首先,数组不能是未定义的.您正在检查数组是否为空.要理解为什么它被清空,你需要了解-n. -n用你的代码包围你的代码
LINE: while (<>) { ... }
这是短的
LINE: while (defined($_ = <ARGV>)) { ... }
ARGV是一个神奇的句柄,可以读取@ARGV中列出的文件,在打开它们时移出文件名.
$echo foo1 > foo $echo foo2 >>foo $echo bar1 > bar $echo bar2 >>bar $echo baz1 > baz $echo baz2 >>baz $perl -nlE' BEGIN { say "Files to read: @ARGV" } say "Read $_ from $ARGV. Files left to read: @ARGV"; ' foo bar baz Files to read: foo bar baz Read foo1 from foo. Files left to read: bar baz Read foo2 from foo. Files left to read: bar baz Read bar1 from bar. Files left to read: baz Read bar2 from bar. Files left to read: baz Read baz1 from baz. Files left to read: Read baz2 from baz. Files left to read:
请记住,BEGIN块一经编译就会执行,因此< ARGV>在执行BEGIN块时(即使它出现在程序的早期版本中)尚未执行,因此@ARGV尚未被修改.