Perl Foreach循环与while(<;>;)组合使用;轮班;来自@ARGV

Perl Foreach循环与while(<;>;)组合使用;轮班;来自@ARGV,perl,Perl,我有一个简单的任务,就是创建一个脚本,该脚本以文件名为参数,读取每个文件中的每一行并检查某些内容 我试着这样做: foreach $file (@ARGV){ while (chomp($line = <>)){ ... } } 如果没有,就不会发生 这是我不明白的部分,我想解释一下。为什么@ARGV每次少1个元素 例如,如果我使用 ./test.pl localhost_access_log*.txt 还有文件 localhost_access

我有一个简单的任务,就是创建一个脚本,该脚本以文件名为参数,读取每个文件中的每一行并检查某些内容

我试着这样做:

foreach $file (@ARGV){
    while (chomp($line = <>)){
         ...
    }
}
如果没有,就不会发生

这是我不明白的部分,我想解释一下。为什么@ARGV每次少1个元素

例如,如果我使用

./test.pl localhost_access_log*.txt
还有文件

localhost_access_log.2008-02-24.txt
localhost_access_log.2008-02-25.txt

在当前文件夹中,在foreach循环之后,@ARGV不会同时拥有这两个循环,而是只有一个循环。

中记录了此行为

while(){
…#每行代码
}
相当于以下类似Perl的伪代码:

unshift(@ARGV, '-') unless @ARGV;
while ($ARGV = shift) {
  open(ARGV, $ARGV);
  while (<ARGV>) {
      ...       # code for each line
  }
}
unshift(@ARGV,'-'),除非@ARGV;
而($ARGV=shift){
开放式(ARGV,$ARGV);
而(){
…#每行代码
}
}
它确实会移动
@ARGV
数组,并将当前文件名放入
$ARGV
变量中。它还在内部使用filehandle
ARGV
只是
的同义词,这很神奇。(上面的伪代码不起作用,因为它将
视为非魔法。)


ARGV
读取已经在
@ARGV
中循环,因此您的代码毫无意义。也许你不知道
意味着
读线(ARGV)
while()
意味着
while(定义的($)
),而
while($line=)
意味着
while(定义的($line=readline(ARGV))
。你应该使用

while ($line = <>) {
    chomp($line);
    ...
}
给予

unshift(@ARGV, '-') unless @ARGV;
while ($ARGV = shift) {
  open(ARGV, $ARGV);
  while (<ARGV>) {
      ...       # code for each line
  }
}
while ($line = <>) {
    chomp($line);
    ...
}
print "Files to read: @ARGV\n";
while (<>) {
    chomp;
    print "Read $_ from $ARGV. Files left to read: @ARGV\n";
}
$ script 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: