Как извлечь значение из переменной в условии if - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь извлечь часть временной метки из переменной, но почему-то функция 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 ]

2 голосов
/ 26 июня 2019

Несколько выпусков:

  1. Вы используете оператор связывания =~ вместо оператора присваивания =
  2. Вы должны всегда use strict и use 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 голос
/ 26 июня 2019

Две проблемы:

  1. =~ - оператор привязки, вы, вероятно, хотите нормальное присваивание.

  2. substr $ts, 10 возвращает позицию формы подстроки 10 до конца $ ts. Чтобы извлечь только 12 символов, используйте

    $ts = substr $ts, 10, 12;
    

Вы также можете извлечь временную метку напрямую:

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