URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5164
[ Назад ]

Исходное сообщение
"Поиск в файле"

Отправлено l5 , 22-Фев-06 13:25 
День добрый.

Есть файл test.txt:
<line1>line1 text</line1>
<line2>line2 text</line2>

И есть скрипт:
#!/usr/local/bin/perl

my $file = 'test.txt';
my $text = grep_file($file, '<line1>([^<]+)<');
print "found: '$text'\n";

$text = grep_file($file, '<line2>([^<]+)<');
print "found: '$text'\n";

sub grep_file {
    my $exclusive_lock = 2;
    my $unlock_lock = 8;
    my $file = @_[0];
    my $pattern = @_[1];
    print "pattern = '$pattern'\t---\t";

    open  (FILE, $file) || print "couldn't open $file\n" && return;
    flock (FILE, $exclusive_lock);
    foreach my $line (<FILE>) {
        $line =~ m/^\#/o && next; # ignore comments
        $line =~ m/$pattern/o || next;
        return $1;
    }
    flock (FILE, $unlock_lock);
    close (FILE);
}

Почему-то ищется всегда толко первый паттерн:
% ./tst.pl
pattern = '<line1>([^<]+)<'     ---     found: 'line1 text'
pattern = '<line2>([^<]+)<'     ---     found: 'line1 text'

Подскажите в чем ошибка.
Спасибо.


Содержание

Сообщения в этом обсуждении
"Поиск в файле"
Отправлено ACCA , 23-Фев-06 10:14 
>Подскажите в чем ошибка.

$line =~ m/$pattern/ || next;


"Поиск в файле"
Отправлено l5 , 23-Фев-06 12:22 
>$line =~ m/$pattern/ || next;
Вот ведь %-))
Спасибо!


"Поиск в файле"
Отправлено ACCA , 25-Фев-06 08:55 
ты ещё FILE ни разу не закрываешь. Программа корявая - читают обычно через while(<>) и делают всё в один проход.

while (<>) {
  next if (/^\s*#/o);
  while (m!<(\w+)>(.?+)</\w+>!go) {
      $data{$1} = $2;
  }
}

И вообще XML [руками] разбирать не стоит - есть более другие способы.