trinitr0
@trinitr0
провинциальный админ

Как в perl найти одну строку в тексте и сравнить?

Есть задача найти определённое место в текстовом файле,
начинающийся со строки, например "Value", и проверить значение
стоящие после двоеточия и вывести строку в случае соответствия значению "A1".
(такая строка в файле только одна!)

open(F1, "/text.txt");
my @raw=<F1>; 
chomp (@raw);
foreach $line (@raw)
{    
    $line =~ m/^\bValue\b\s+:\s+([A-Z0-9]+)$/o;
    if ($1 eq A1)
    {
        print "$line \n";
    }
    
}
close(F1);


У меня получается так, что начиная с искомой строчки вываливается весь остаток строк из файла, вместо одной искомой.
Как исправить такое поведение?
  • Вопрос задан
  • 611 просмотров
Решения вопроса 1
@pcdesign
Надо брать в кавычки
$1 eq "A1"

А так я создал файл text.txt с таким содержимым:
uihkjh
dsfkljsdklf 
Value : A1
dfds


use strict;
use warnings;
use utf8;

open( F1, "text.txt" );
my @raw = <F1>;
chomp (@raw);
foreach my $line (@raw) {
    my ($val) = $line =~ m/^\bValue\b\s+:\s+([A-Z0-9]+)$/o;
    next unless $val;
    if ( $val eq "A1"  ) {
        print "$line \n";
    }

}
close(F1);


Немного изменил ваш код.
Результат:
Value : A1
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@PavelKuptsov
Программист, системный администратор
На мой взгляд было бы красивее так:
#!/usr/bin/perl -w

use strict;

open(F1, "<","test.txt") || die $!;
while(<F1>)
{
        chomp;
        /^\bValue\b\s+:\s+([A-Z0-9]+)$/g;
next unless $1;
    if ($1 eq "A1")
    {
        print "$_\n" and exit 0;
    }

}
close(F1);


Это во-первых не потребует полного чтения файла (после того как мы нашли значение - выходим из программы), во-вторых меньший расход памяти (вы сперва читаете файл в массив - что не надо, лучше построчное чтение через while())
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы