Perl:如何从文件夹

时间:2017-01-30 11:35:41

标签: perl

任何人都可以帮助我解决以下问题的Perl脚本:

File1.txt - >使用关键字进行搜索

Hello_ 
World!
+Bye
Temp-

File2(可以是任何扩展名)在哪个关键字中搜索,File3,File4 ....

我想在File2中搜索File1中的所有关键字,如果找到它们,则打印找到的关键字以及找到此特定关键字的文件编号和行号。

我希望这些关键字和文件不会无限期 - 可以添加和修改它们。

open(MYINPUTFILE, "<expressions.txt");
# open for input

my(@lines) = <MYINPUTFILE>;
#print @lines;

my @files = grep ( -f ,<*main_log>,<*Project>);

$n = 0;
$l = 0;
#foreach my$file (@files) {
foreach my $line (@lines) {
    my @f = grep /$line/,@files;
    print "@f\n";
}
#}
}

问题 - 我试图执行上面的代码,但它不会在我的命令提示符下打印任何内容。我正在使用Windows 7

1 个答案:

答案 0 :(得分:0)

此答案基于您发布的代码:

use strict; # always use these
use warnings; 

open( my $kw, '<', 'expressions.txt') or die $!;
my @keywords = <$kw>;
chomp(@keywords); # remove newlines at the end of keywords

# get list of files in current directory
my @files = grep { -f } (<*main_log>,<*Project>);

# loop over each file to search keywords in
foreach my $file (@files) {
  open(my $fh, '<', $file) or die $!;
  my @content = <$fh>;
  close($fh);
  my $l = 0;
  foreach my $kw (@keywords) {
    my $search = quotemeta($kw); # otherwise keyword is used as regex, not literally
    foreach (@content) { # go through every line for this keyword
      $l++;
      printf 'Found keyword %s in file %s, line %d:%s'.$/, $kw, $file, $l, $_
        if /$search/;
    }
  }
}

关于以下评论中的问题:

最里面的循环只计算行号$l++并在出现的情况下发出查找 - if /$search/仍然是上述语句的一部分。它也可以写成

if ( /$search/ ) {
  printf ...
}

printf用于格式化输出。您也可以通过简单地使用print并将所有需要的变量汇总来完成此操作。我只是喜欢这种方式。

这假定您希望每个文件的每个关键字的找到行列表。您必须切换@keywords@content的顺序和逻辑才能对其进行排序。

有关关键字文件中评论的其他功能,您必须对内容进行后处理,以便从评论中识别搜索字词。可能在哈希中,搜索词为关键词,注释为值。然后你可以只使用哈希键进行搜索(参见最里面的循环)并将注释(如果存在的话)作为附加行放出。