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
变量中。它还在内部使用filehandleARGV
只是
的同义词,这很神奇。(上面的伪代码不起作用,因为它将
视为非魔法。)
从
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: