查找不包含特定字符串的文件

daf*_*dil 1 perl

我要查找不包含特定字符串的文件吗?列出的文件如下所示

../../../experiment/fileA.txt (contain word 'Book')
../../../experiment/fileB.txt (contain word 'Book')
../../../experiment/fileC.txt (do not contain word 'Book')
../../../experiment/fileD.txt (contain word 'Book')
Run Code Online (Sandbox Code Playgroud)

这是我的代码

use strict;
use warning;

my $dirname = "../../../experiment/";
my $keyword = "Book";
my @result;

my $find_file = sub {
    my $F = $File::Find::name;
    if ($F =~ /txt$/) {
       open my $in, "<", $F or die $!;
       while(<$in>) {
          if (/\Q$keyword\E/){
             next;
          }else{
             push @result, $F;
             return;          
          }
      }
   }  
};

find ({ wanted => $find_file, no_chdir=>1}, $dirname );
foreach my $result (@result){
   chomp $result;
   $result =~ s{.*/}{};
   print "$result\n";
}   
Run Code Online (Sandbox Code Playgroud)

但似乎不起作用。无论是否具有$ keyword,它都会显示所有文件。我只希望它仅在文件没有$ keyword时显示

zdi*_*dim 5

有一个简单的逻辑错误。代码遍历每个文件的行

while (<$in>) {
    if (/\Q$keyword\E/){
        next;
    } else {
        push @result, $F;
        return;          
    }
}
Run Code Online (Sandbox Code Playgroud)

并且只要任何一条线路没有$keyword把它添加的文件@result

您需要检查所有行,如果$keyword从未找到,则添加一个文件。最简单的方法return是在找到东西后立即从潜艇

while (<$in>) {
    return if /\Q$keyword/;
}

push @result, $F;
Run Code Online (Sandbox Code Playgroud)