如何在if条件下从变量中提取值

How to extract a value from a variable within if condition

我正在尝试从变量中提取时间戳部分,但 substr 函数无法正常工作

这是我试过的

while(<INFILE>){
chomp;
if(/timestamp:(.+$)/){
                        $ts = ;
                        $ts =~ substr($ts, 10);
print $ts;
}

close(INFILE);

文件中的行是这样的

timestamp: 25JUN2019_02:55:02.234
somedata..
..
..
..

timestamp: 25JUN2019_07:00:28.718

我希望输出为

02:55:02.234
07:00:28.718

但输出是

25JUN2019_02:55:02.234
25JUN2019_07:00:28.718

两个问题:

  1. =~ 是绑定运算符,您可能需要正常赋值。

  2. substr $ts, 10 returns 子字符串从位置 10 到 $ts 的末尾。要仅提取 12 个字符,请使用

    $ts = substr $ts, 10, 12;
    

也可以直接提取时间戳:

if(my ($ts) = /timestamp: [^_]+_(\S+)/){
    print $ts, "\n";
}

几个问题:

  1. 您正在使用绑定运算符 =~ 而不是赋值运算符 =
  2. 你应该总是use strictuse warnings
  3. 你应该忽略匹配前的空格
  4. 如果行上有其他数据,substr 也会return。您应该将 substr 的范围限定为只包含您想要的内容。

修改后的代码:

use strict;
use warnings;

while(<DATA>) {
  chomp;
  if (/timestamp:\s*(.+$)/) {
    my $ts = substr(, 10, 12); # only include length of data you want
    print $ts;
  }
}

__DATA__
timestamp: 25JUN2019_02:55:02.234

输出:

02:55:02.234