任何人都可以帮助我解决以下问题的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
答案 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
的顺序和逻辑才能对其进行排序。
有关关键字文件中评论的其他功能,您必须对内容进行后处理,以便从评论中识别搜索字词。可能在哈希中,搜索词为关键词,注释为值。然后你可以只使用哈希键进行搜索(参见最里面的循环)并将注释(如果存在的话)作为附加行放出。