【问题标题】:grep keyword with if-condition带有 if 条件的 grep 关键字
【发布时间】:2013-07-30 23:02:09
【问题描述】:

我有一个输入文件

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, &lt;FILE&gt; line 384.&lt;FILE&gt; 的所有行都会出现这种情况)

我找到了另一个没有 if 条件的解决方案,它只声明 @string = sort grep /^keyword/,&lt;FILE&gt;; 并且有效。你能解释一下这里发生了什么吗?

/编辑

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

【问题讨论】:

  • 您的grep 问题基本上是不相关的,因为它不能解决这个精确的问题。请一题一题;如果您仍然希望得到答案,请发布一个单独的问题,因为您已经在此处接受了答案,因此将您的问题标记为已解决。

标签: perl if-statement grep


【解决方案1】:

您需要进行以下更改:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这只是在没有: 的情况下工作。像 1e-5 这样的数字会被削减。我现在也刚刚注意到以下问题。
    猜你喜欢
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2016-09-25
    • 1970-01-01
    • 2016-01-23
    • 2015-03-19
    相关资源
    最近更新 更多