-1

我有一个输入文件

words;
yadda yadda;
keyword 123;
yadda;

我想简单地将值 123 保存为变量。我从这里尝试了一个解决方案:

my $var;
open(FILE,$data.dat) or die "error on opening $data: $!\n";
while (my $line = <FILE>) {
        if (/^keyword/) {
                $var = $1;
                print $line;
                last;
        }
}
close(FILE);

这不起作用并给我以下错误:(Use of uninitialized value $_ in pattern match (m//) at ./script.pl line 91, <FILE> line 384.这发生在所有行<FILE>

我找到了另一个没有 if 条件的解决方案,它只是陈述@string = sort grep /^keyword/,<FILE>;和工作。你能向我解释一下这里发生了什么吗?

/编辑

谢谢你的答案和解释!您认为更好/更优雅的方式是什么?grep 还是 if 条件?

4

2 回答 2

2

$1指的是第一个捕获组,但您的正则表达式不包含任何捕获组,因此它是未定义的。尝试

if ($line =~ /^keyword\s+(-?(?:\d+|\d*\.\d*)(?:[Ee]-?(?:\d+|\d*\.\d*))?)/) {

另请注意,正则表达式正在应用于包含您刚刚阅读的行的变量。

编辑:更新以应对科学计数法中的数字。这是一个重要的附加要求,您应该首先明确指定。

于 2013-07-30T13:25:40.357 回答
2

您需要进行以下更改:

if ($line =~ m/^keyword\s+(\d+)/)

说明:您读入了 $line,因此未定义匹配的默认目标 $_。此外,$1 还会出现另一个错误,因为您的模式没有指定捕获组。

于 2013-07-30T13:26:45.257 回答