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

时间:2019-06-26 20:46:46

标签: perl substr

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

这是我尝试过的

while(<INFILE>){
chomp;
if(/timestamp:(.+$)/){
                        $ts = $1;
                        $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

2 个答案:

答案 0 :(得分:2)

几个问题:

  1. 您正在使用绑定运算符=~而不是赋值运算符=
  2. 您应始终use strictuse warnings
  3. 比赛前您应该忽略空格
  4. 如果该行上还有其他数据,substr也将返回它。您应该将substr的范围设置为仅包含您想要的内容。

修改后的代码:

use strict;
use warnings;

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

__DATA__
timestamp: 25JUN2019_02:55:02.234

输出:

02:55:02.234

答案 1 :(得分:1)

两个问题:

  1. =~是绑定运算符,您可能需要常规分配。

  2. substr $ts, 10将子字符串形式的位置10返回到$ ts的末尾。要仅提取12个字符,请使用

    $ts = substr $ts, 10, 12;
    

您还可以直接提取时间戳:

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