我怎么知道钻石操作员是否移到了下一个文件



我在文件perl_script.pl:中有以下代码

while (my $line = <>) {
chomp $line;
// etc. 
}. 

我调用具有多个文件的脚本,例如

perl perl_script.pl file1.txt file2.txt

有没有办法知道$line是否开始从file2.txt等读取?

$ARGV变量

包含从<>读取时当前文件的名称

,您可以保存名称并对每一行进行测试,看看它是否发生了更改,并在更改时进行更新。

如果真的只是访问一个特定的文件,就像问题所说的那样,那么它会更容易,因为您还可以使用包含命令行参数的@ARGV来直接测试所需的名称。


另一个选项是使用eof(没有括号的形式!(来测试文件结尾,这样您就知道下一个文件将在下一次迭代中出现,所以您也需要某种类型的标志。

对此的一个变体是显式关闭每个文件末尾的文件句柄,以便为每个新文件重置$.,而<>通常不会发生这种情况,然后$. == 1是新打开的文件的第一行

while (<>) { 
if ($. == 1) { say "new file: $ARGV" }
} 
continue { 
close ARGV if eof;
} 

perldoc-f eof中记录的一个有用技巧是while (<>)循环中的} continue { close ARGV if eof }习惯用法。这导致$.(输入行号(在ARGV迭代的文件之间重置,这意味着它将始终是给定文件的第一行上的1

eof的诀窍,但祝你好运,能向人们解释这一点。我通常发现我也想对旧文件名做些什么。

根据你想做的事情,你可以跟踪你的文件名正在处理,以便您可以识别何时更改为新文件。那样你同时知道两个名字:

use v5.10;
my %line_count;
my $current_file = $ARGV[0];
while( <> ) {
if( $ARGV ne $current_file ) {
say "Change of file from $current_file to $ARGV";
$current_file = $ARGV;
}
$line_count{$ARGV}++
}
use Data::Dumper;
say Dumper( %line_count );

现在您可以看到文件何时更改,并且可以使用$ARGV

Change of file from cache-filler.pl to common.pl
Change of file from common.pl to wc.pl
Change of file from wc.pl to wordpress_posts.pl
$VAR1 = {
'cache-filler.pl' => 102,
'common.pl' => 13,
'wordpress_posts.pl' => 214,
'wc.pl' => 15
};

根据我在做什么,我可能不会让钻石操作员做所有的事情工作。这让我对正在发生的事情有了更多的控制我如何应对:

foreach my $arg ( @ARGV ) {
next unless open my $fh, '<', $arg;
while( <$fh> ) { 
...
}
}

相关内容

最新更新