【发布时间】:2012-08-22 21:19:28
【问题描述】:
继我之前提出的一个问题之后,我试图从两个文件中读取数据,然后逐行解析一个文件,以匹配另一个文件每一行中包含的字符串。第一个是日志文件,第二个我将调用我的密钥文件。我决定使用 foreach 循环遍历密钥文件,然后将其嵌入其中,一个 while 循环将逐步遍历日志的每一行。我正在尝试使用模式匹配来识别特定的字符串,但是这个字符串要么被两个加号(即+name+)包围,要么被一个加号和一个星号(即+name*)包围。不幸的是,我没有太多运气让模式匹配工作......我在下面包含了我的模式搜索代码段的主体:
foreach $element (@fr_array) {
open (LOGFILE, "<", $logname) or die $!;
while (<LOGFILE>) { #While reading one line at a time from the log....
chomp;
$log_string = <LOGFILE>;
if ($log_string =~ /\+$element\+/) {
$fr_count++;
print "Counter increment since $log_string is the same as $element.";
$log_match++;
}
}
编辑
感谢大家的反馈...我调用的几个命令用于帮助我跟踪程序并找到问题...我接受了一些建议,经过更多研究后,我尝试改用 grep 命令,但模式匹配似乎仍然无法正常工作。无论我使用什么作为搜索字符串,它似乎都被解析为真的。我整天都在查看代码,但我也不太确定从这里去哪里。在使用正则表达式失败后,我决定使用不同的搜索字符串,这个字符串由除了几个等号之外的所有文字组成。现在,澄清一下,一旦找到匹配项,我就不想对它们做任何事情,我只需要跟踪有多少匹配项,因此我使用了计数器。无论如何,我将包含我现在所在位置的更新代码段。我已经确认我的循环工作正常,这只是模式匹配的问题。我现在得到结果,但数字不准确....我的测试日志应该只返回 1 或 2,但它向我吐出 204。
open (LOGFILE, "<", $logname) or die $!;
while($log_string = <LOGFILE>) {
chomp $log_string;
foreach $element (@fr_array) {
$fr_count++ if (grep {"Action=123 Cls=AM"} $log_string)
再次感谢大家的帮助和耐心。 :)
【问题讨论】:
-
你试过'grep -f key_file log_file'命令吗?你在 perl 中做同样的事情。
-
您的代码会出现问题,因为您尝试
OPEN一个已经不是CLOSEd 的文件。如果您确实关闭了循环内的文件,它将从头开始读取(类似于seek)。 -
好的,我想我知道它在做什么,虽然我不太确定如何更正它....我的带有 ID 的测试文件有 103 个条目,因此将从 0 开始递增,总共 102,并且条目只显示两次,因此 102 * 2 = 204。所以它正在定位它们,但每次找到一个 ID 时,它都会增加我的计数器的 ID 总数。
标签: regex perl grep pattern-matching file-handling