Perl проверить элемент массива в файле - PullRequest
0 голосов
/ 17 марта 2020

Мне нужно проверить, существует ли элемент массива из @lines в файле данных. Из файла данных необходимо проверить соответствующий элемент problem. Если да, распечатайте соответствующие элементы данных на экране. Элементы: problem, occaredtime, text.

Сценарий находится ниже:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;

my @lines = qw/problem1 problem4/;
print Dumper \@lines;

while (<DATA>){
    my ($problem, $time, $text);

    my $line = $_;
    chomp($line);

    if( $line =~ /problem\s+:\s+(.*)/ ){
        $problem    =   $1; 
    }

    if( $line =~ /time\s+:\s+(.*)/ ){
        $time   =   $1; 
    }

    if( $line =~ /comment\s+:\s+(.*)/ ){
        $text   =   $1; 
    }

    if (grep { $_ eq $problem } @lines){
        print "Exists: $problem ** $time ** $text\n";
    }       
}

__DATA__
problem : problem1
occaredtime : 2020-03-17T06:28:18
comment : this is text for problem1

problem : problem2
occaredtime : 2020-03-17T05:00:00
comment : this is text for problem2

problem : problem3
occaredtime:2020-03-17T01:00:00
comment : this is text for problem3


Но здесь его данные печати, как показано ниже, вместо одной строки:

Exists: problem1 **  **
Exists: problem1 ** 2020-03-17T06:28:18 **
Exists: problem1 ** 2020-03-17T06:28:18 ** this is text for problem1
Exists: problem1 ** 2020-03-17T06:28:18 ** this is text for problem1

Может кто-нибудь, пожалуйста, дайте мне знать, почему он печатает таким образом.

РЕДАКТИРОВАТЬ:

Мне нужно печатать только ниже строки:

Exists: problem1 ** 2020-03-17T06:28:18 ** this is text for problem1

1 Ответ

2 голосов
/ 17 марта 2020

У вас 2 ошибки. Во-первых, вам нужно объявить переменную $problem вне l oop, потому что вы хотите сохранить ее значение после каждой строки; То же самое относится и к переменной времени. Во-вторых, вы должны проверять, если проблема желательна, когда вы читаете строку comment:

use strict;
use warnings;

my @lines = qw/problem1 problem4/;

my ($problem, $time, $text);
while (<DATA>){

    my $line = $_;
    chomp($line);

    if( $line =~ /problem\s+:\s+(.*)/ ){
        $problem    =   $1; 
    }

    if( $line =~ /time\s+:\s+(.*)/ ){
        $time   =   $1; 
    }

    if( $line =~ /comment\s+:\s+(.*)/ ){
        $text   =   $1; 
        if (grep { $_ eq $problem } @lines){
            print "Exists: $problem ** $time ** $text\n";
        }       
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...