-1

我正在使用以下 Perl 脚本搜索多个文件,并在该行中的特定数字匹配时打印出整个文本行:

#!/perl/bin/perl

use strict;
use warnings;

my @files = <c:/perl64/myfiles/*>;

foreach my $file (@files) {
  open my $file_h, '<', $file
   or die "Can't open $file: $!";

  while (<$file_h>) {
print "$file $_" if /\b1203\b/; 
print "$file $_" if /\b1204\b/;
print "$file $_" if /\b1207\b/;
  } }

每次在一个或多个文件的一行中存在数字时,该脚本都可以很好地匹配和打印。我的问题是,我希望能够确定任何文件中该数字何时根本不匹配。

我们正在解析具有数千行的多个文件,因此要找到增量(即在任何文件中均不匹配此数字)非常耗时。

澄清一下,每次在每个文件中匹配数字时,我仍然需要匹配和打印,而不仅仅是匹配一次。它匹配的行输出对于打印也是至关重要的。

最终这只是为了显示该数字是否在任何文件中的任何位置都不匹配。

为便于阅读而编辑的源代码

#!/perl/bin/perl

use strict;
use warnings;

my @files = <c:/perl64/myfiles/*>;

foreach my $file ( @files ) {

    open my $file_h, '<', $file or die "Can't open $file: $!";

    while ( <$file_h> ) {
        
        print "$file $_" if /\b1203\b/;
        print "$file $_" if /\b1204\b/;
        print "$file $_" if /\b1207\b/;
    }
}
4

1 回答 1

0

我希望能够确定任何文件中该数字何时根本不匹配

由于您要查看多个文件,因此您需要记住您曾经看到过某个数字。用于计数的哈希在这里非常有用,并且是解决此类问题的常用方法。

同时将数字(或模式)移动到数组中是有意义的。这样你只需要在你的代码中列出一次,整个代码就变得不那么混乱了。

my @numbers = (1203, 1204, 1205);
my %seen;
foreach my $file (@files) {
    # ...
    while (<$file_h>) {
        foreach my $number (@numbers) {
            if (/\b$number\b/) {
                print "$file $_"; 
                $seen{$number} = 1; # we don't care how many, just that we saw it
             }
        }
    }
}

# At this point, %seen contains a key for every number that was seen at least once.
# If a number was not seen, it will not have a key.

# output numbers that were not seen
foreach my $number (@numbers) {
    print "no match: $_\n" unless exists $seen{$number};
}
于 2017-12-04T14:22:46.017 回答