0

我有一个文本文件内容如下:

 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 程序来获取包含“不匹配”的行的值

#!/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

4 回答 4

2

即使没有任何东西,$1 也会被打印出来。它应该处于以下状态:

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

要将所有值存储在数组中:

push @arr,$1 if (/Mismatched at (\d+)/);
于 2013-04-03T07:11:51.037 回答
1

将正则表达式更改为:

/at\s+(\d+)/;
于 2013-04-03T07:15:20.710 回答
0

您已经得到了向您展示正确方法的答案,但还没有任何答案可以解释您做错了什么。问题出在您的正则表达式中。

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

让我们分解它,看看它试图匹配什么。

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

因此,实际上,您正在寻找 'at' 后跟双引号字符串。而且您正在捕获(进入$1)双引号字符串的内容。

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

我很想听听您为什么认为要在不包含任何双引号字符的文本中匹配双引号字符。

于 2013-04-03T12:19:07.850 回答
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";
于 2013-04-03T12:24:29.963 回答