perl - 为什么在这个 Perl 单行代码中未定义 @ARGV?

标签 perl

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/

相关文章:

regex - 索引函数中的正则表达式

html - Perl-我如何知道套接字客户端何时断开连接(用户关闭窗口/浏览器时)

json - Perl,检查各种类型的哈希值是否为空键值,json

xml - 在 XML 中编码和符号

perl - 你如何在没有 eval 的情况下本地化一些遗留的全局变量?

perl - 制作简单的 Perl 配置文件的最佳方法是什么?

perl - Perl中上传文件的现代核心方法

perl - 检测编译后的perl脚本是否动态加载模块

java - Perl 将 bash 管道发送到 Java

linux - 从 shell 脚本调用脚本 - 找不到获取命令