我有一个带
的输入文件words;
yadda yadda;
keyword 123;
yadda;
我想简单地将值123保存为变量。我尝试了here的解决方案:
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条件?
答案 0 :(得分:2)
$1
指的是第一个捕获组,但是你的正则表达式不包含任何捕获组,所以它是未定义的。尝试
if ($line =~ /^keyword\s+(-?(?:\d+|\d*\.\d*)(?:[Ee]-?(?:\d+|\d*\.\d*))?)/) {
另请注意,正则表达式正在应用于包含您刚读过的行的变量。
编辑:更新以应对科学记数法中的数字。这是一个重要的附加要求,您应该首先明确指定。
答案 1 :(得分:2)
您需要进行以下更改:
if ($line =~ m/^keyword\s+(\d+)/)
说明:你读入$ line,因此$ _这是匹配的默认目标是未定义的。 此外,您还会收到$ 1的另一个错误,因为您的模式未指定捕获组。