Stackoverflower 的 friend tried to use @ARGV
在他的END
阻止但无法。
为什么是@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
block 在编译后立即执行,因此 <ARGV>
BEGIN
时尚未执行 block 正在执行(即使它出现在程序的前面),所以 @ARGV
尚未修改。-n
记录在 perlrun . ARGV
, @ARGV
和 $ARGV
记录在 perlvar .
关于perl - 为什么在这个 Perl 单行代码中未定义 @ARGV?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8703225/