我正在尝试匹配匹配expressions.txt
的所有文件中名为*main_log
的文件中的关键字/文本/行。找到匹配项后,我想打印匹配的每一行的注释。
有没有更好的方法来打印?
expression.txt
Hello World ! # I want to print this comments#
Bye* #I want this to print when Bye Is match with main_log#
:::
:::
以下是我使用的代码:
{
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>, <*properties> );
# 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
#$kw =~ m/\[(.*)\]/;
$kw =~ m/\((.*)\)/;
my $temp = $1;
print "$temp\n";
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/;
}
}
}
我尝试使用此代码打印括号(...)
中提到的注释,但它不是以我想要的方式打印,如下所示:
如果expression.txt包含
Hello World ! # I want to print this comments#
如果Hello World !
字符串在我的名为main_log
的文件中匹配,那么它应仅与Hello World!
中的main_log
匹配,而是打印# I want to print this comments#
作为用户评论了解关键字。
这些关键字可以是任意长度或包含任何字符。
虽然我已经使用了perl -w Test.pl&gt;但它工作正常,但是对将所需输出打印到文件中有点疑问命令提示符下的my_output.txt命令不确定如何使用perl脚本本身
open( my $kw, '<', 'expressions.txt') or die $!;
my @keywords = <$kw>;
chomp(@keywords); # remove newlines at the end of keywords
# post-processing your keywords file
my $kwhashref = {
map {
/^(.*?)(#.*?#)*$/;
defined($2) ? ($1 => $2) : ( $1 => undef )
} @keywords
};
# get list of files in current directory
my @files = grep { -f } (<*main_log>,<*Project>,<*properties>);
# 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) {
foreach my $kw (keys %$kwhashref) {
my $search = quotemeta($kw); # otherwise keyword is used as regex, not literally
#$kw =~ m/\[(.*)\]/;
#$kw =~ m/\#(.*)\#/;
#my $temp = $1;
#print "$temp\n";
foreach (@content) { # go through every line for this keyword
$l++;
if (/$search/)
{
# only print if comment defined
print $kwhashref->{$kw}."\n" if defined($kwhashref->{$kw}) ;
printf 'Found keyword %s in file %s, line %d:%s'.$/, $kw, $file, $l, $_
#printf '$output';
}
}
}
}
答案 0 :(得分:1)
您的示例代码的大括号{ ... }
不匹配,无法编译。
如果要在代码末尾添加另一个右括号,那么它将编译,但行
$kw =~ m/\((.*)\)/;
永远不会成功,因为expressions.txt
中的任何地方都没有括号。如果匹配未成功,则$1
的值将从最近成功的正则表达式匹配操作中保留
您还尝试根据从expressions.txt
检索到的所有行搜索文件中的行,此时您应将这些行拆分为关键字及其相应的注释
答案 1 :(得分:0)
这似乎是对你的另一个问题answer的后续跟进。我在最后一段中尝试建议的内容将在您的代码的前三行之后开始:
# post-processing your keywords file
my $kwhashref = {
map {
/^(.*?)(#.*?#)*$/;
defined($2) ? ($1 => $2) : ( $1 => undef )
} @keywords
};
现在,您在hashref中包含关键字,其中包含要作为键搜索的实际关键字,并将注释作为值(如果存在)(在此处使用行末尾语法#comment#
)。
你的关键字循环现在必须使用keys %$kwhashref
,你现在还可以在内循环中打印注释,转换如我链接的答案所示。附加印刷品:
print $kwhashref->{$kw}."\n" if defined($kwhashref->{$kw}); # only print if comment defined