Foreach循环结合while(<>)从@ARGV"移位"

Fis*_*eon 2 perl

我有一个简单的任务,创建一个脚本,将文件名作为参数,读取每个文件中的每一行并检查一些东西.

我尝试这样做:

foreach $file (@ARGV){
    while (chomp($line = <>)){
         ...
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然我明白虽然只是阅读所有文件,而且这种方法并不好,但我注意到在每次"foreach"迭代后,@ ARGV丢失了一个条目,好像有一个条目

shift @ARGV;
Run Code Online (Sandbox Code Playgroud)

如果没有,就不会发生这种情况

这是我不理解的部分,想要解释.为什么@ARGV每次减少1个元素?

例如,如果我用脚本调用脚本

./test.pl localhost_access_log*.txt
Run Code Online (Sandbox Code Playgroud)

还有文件

localhost_access_log.2008-02-24.txt
localhost_access_log.2008-02-25.txt
Run Code Online (Sandbox Code Playgroud)

在当前文件夹中,在foreach循环之后,@ ARGV将不会同时拥有它们,而只有一个.

Сух*_*й27 6

perldoc中记录了此行为

while (<>) {
    ...         # code for each line
}
Run Code Online (Sandbox Code Playgroud)

等效于以下类似Perl的伪代码:

unshift(@ARGV, '-') unless @ARGV;
while ($ARGV = shift) {
  open(ARGV, $ARGV);
  while (<ARGV>) {
      ...       # code for each line
  }
}
Run Code Online (Sandbox Code Playgroud)

它确实会移动@ARGV数组并将当前文件名放入$ARGV变量中.它还在ARGV内部使用文件句柄.<>只是一个同义词<ARGV>,这是神奇的.(上面的伪代码不起作用,因为它被视为<ARGV>非魔法.)