我有一个简单的任务,创建一个脚本,将文件名作为参数,读取每个文件中的每一行并检查一些东西.
我尝试这样做:
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将不会同时拥有它们,而只有一个.
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>非魔法.)