gpt4 book ai didi

perl - Foreach 循环结合 @ARGV 的 while(<>) "shifts"

转载 作者:行者123 更新时间:2023-12-05 00:47:19 26 4
gpt4 key购买 nike

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

我试过这样做:

foreach $file (@ARGV){
while (chomp($line = <>)){
...
}
}

虽然我知道 while 会简单地读取所有文件,而且这种方法不好,但我注意到在每次“foreach”迭代之后,@ARGV 都会丢失一个条目,就好像有一个

shift @ARGV;

如果没有就不会发生

这是我不明白的部分,希望得到解释。为什么@ARGV每次都少1个元素?

例如,如果我调用脚本

./test.pl localhost_access_log*.txt

还有文件

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

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

最佳答案

此行为记录在 perldoc

while (<>) {
... # code for each line
}

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

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

It really does shift the @ARGV array and put the current filename into the $ARGV variable. It also uses filehandle ARGV internally. <> is just a synonym for <ARGV>, which is magical. (The pseudo code above doesn't work because it treats <ARGV> as non-magical.)

关于perl - Foreach 循环结合 @ARGV 的 while(<>) "shifts",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23521106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com