我希望我的程序从包含数组中任何关键字的文件中提取行,但它只显示关键字文件中的最后一个关键字。我如何修复它以确保它找到所有关键字?
`<table st-default-selection="selectedRow" st-table="table" st-safe-src="rowCollection"></table>`
答案 0 :(得分:4)
您需要chomp行删除换行符。
此外,从列表上下文中的文件句柄中读取
our @keywordArray = <keyWords>;
读取整个文件,因此以下
中无法读取任何内容while ( my $line = <keyWords> ) {
从所有关键字创建一个正则表达式比单独匹配每个正则表达式要快得多:
#!/usr/bin/perl
use strict;
use warnings;
sub main {
my $keywordFile = 'keyword.txt';
open $KW, $keywordFile or die "$keywordFile not found\n";
chomp( my @keywords = <$KW> );
my $keyword_regex = join '|', map quotemeta, @keywords;
$keyword_regex = qr/($keyword_regex)/;
my $fileName = 'syslog.txt';
my $outputFile = 'outputfile.txt';
open my $SL, $fileName or die "$fileName not found\n";
open my $OUT, '>', $outputFile or die "$outputFile not found\n";
while (my $line = <$SL>) {
if ($line =~ /$keyword_regex/) {
print "\n-------$1--------\n";
print "$line";
print $OUT "$line";
}
}
close $OUT;
}
main();
print "\n";
答案 1 :(得分:2)
问题是@keywordArray
中的字符串包含文件中的换行符。
你应该使用chomp
来解决这个问题(你应该my
优先使用our
),而不是
our @keywordArray = <keyWords>;
while ( my $line = <keyWords> ) {
push( @keywordArray, ($line) );
}
你应该写
my @keywordArray;
while ( my $line = <keyWords> ) {
chomp $line;
push @keywordArray, $line;
}
或更好
chomp(my @keywordArray = <keyWords>);
以下是一些需要注意的重要事项
熟悉高质量Perl的人会感谢您使用snake_case
作为基本词汇变量。 CamelCase
通常保留用于全局标识符,例如包名称
您最好使用open
的三参数形式,但您还应该使用 lexical 文件句柄。你使用了词法和全局句柄的混合,这是所有
无需将整个程序放在子程序中然后调用它。这不是C
如果您测试open
调用的状态并发现它已失败,则应将内置变量$!
的内容放在die
字符串中说为什么打开失败。除了您编码的文件未找到之外,可能还有其他几个原因。更好的是,您可以启用autodie
,它将检查您的所有文件系统操作并生成适当的die
字符串
用our
声明的变量非常有用。您应该始终使用my
,除非您有充分的理由需要包变量
@keywordArray = <keyWords>
将整个文件读入数组,并将其保留在eof中。以下循环永远不会执行,因为没有什么可以从文件句柄中读取
答案 2 :(得分:-1)
如果您指的是输出文件仅包含与关键字匹配的最后一行,那是因为您要打开输出文件进行写入,这意味着您要覆盖之前在其中写入的所有内容。你应该打开它来追加:
open(my $fh, '>>', $outputFile) or die "$outputFile not found\n";