加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

为什么@ARGV在这个Perl单行内部未定义?

发布时间:2020-12-15 23:22:05 所属栏目:大数据 来源:网络整理
导读:他的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 对此事
他的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尚未被修改.

-n记录于perlrun. ARGV,@ ARGV和$ARGV记录于perlvar.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读