如何在找到关键字后匹配整数?

时间:2013-04-03 07:08:11

标签: perl unix

我的文本文件内容如下:

 Starting log...
    Sample at 10000000
    Mode is set to 0
    0007F43: CHANGE DETECTED at  290313 line 0 from 00 to 04
    0007F46: Mismatched at 290316 line 0
    0007F50: Matched occur at 290326 line 1
    0007F53: Mismatched at 290336 line 2
    0007F56: Matched occur at 290346 line 0
    0007F60: Mismatched at 290356 line 2
    0007F63: Matched occur at 290366 line 0
    Saving log....
    DONE!!!

我正在运行简单的perl程序,如下所示,以获取该行的值包含“Mismatched”

#!/usr/bin/perl

print "Starting perl script\n\n";
open (LOG,"dump.log");

while (<LOG>) {
 next if !/Mismatched/;
 /at\s+"([^"]+)"/;
 print $1,"\n";
}
close(LOG);
print "DONE!!\n";
exit;

但是我得到如下错误信息,我可能知道我的编码有什么问题吗?我错过了与chomp()相关的任何事情吗?

Use of uninitialized value in print at test.pl line 9, <LOG> line 5.
Use of uninitialized value in print at test.pl line 9, <LOG> line 7.
Use of uninitialized value in print at test.pl line 9, <LOG> line 9.
DONE!!

并且..是否有任何建议在使用更简单的脚本编写搜索关键字“不匹配”后获取整数(即290316)?我只是想获得第一个值..

4 个答案:

答案 0 :(得分:2)

即使没有任何东西,也会打印出1美元。它应该处于一个条件:

print $1,"\n" if (/Mismatched at (\d+)/);

将所有值存储在数组中:

push @arr,$1 if (/Mismatched at (\d+)/);

答案 1 :(得分:1)

将正则表达式更改为:

/at\s+(\d+)/;

答案 2 :(得分:0)

你已经得到了答案,告诉你正确的方法,但没有任何解释你做错了什么。问题在于你的正则表达式。

/at\s+"([^"]+)"/

让我们分解它,看看它想要匹配的东西。

  • at:字符串'at'
  • \s+:一个或多个空白字符
  • ":双引号字符
  • ([^"]+):一个或多个不是双引号字符的字符
  • ":双引号字符

所以,实际上,你正在寻找'at',然后是双引号字符串。并且您正在捕获(进入$1)双引号字符串的内容。

但是您的数据都不包含任何双引号字符。所以没有双引号字符串。所以没有任何东西匹配,任何东西都没有被捕获到$1。当您尝试打印$1时,这就是“未初始化值”错误的原因。

我很想知道为什么你认为你想在一段不含任何文字的文本中匹配双引号字符。

答案 3 :(得分:0)

我会更改你的脚本以实现更现代的perl风格:

#!/usr/bin/perl

use strict;
use warnings;

print "Starting perl script\n\n";
open my $LOG, '<', 'dump.log' or die $!;

while( <$LOG> ) {
  print "$1\n" if /Mismatched at (\d+)/;
}
close $LOG;
print "DONE!!\n";