День добрый.Есть файл test.txt:
<line1>line1 text</line1>
<line2>line2 text</line2>И есть скрипт:
#!/usr/local/bin/perlmy $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'Подскажите в чем ошибка.
Спасибо.
>Подскажите в чем ошибка.$line =~ m/$pattern/ || next;
>$line =~ m/$pattern/ || next;
Вот ведь %-))
Спасибо!
ты ещё FILE ни разу не закрываешь. Программа корявая - читают обычно через while(<>) и делают всё в один проход.while (<>) {
next if (/^\s*#/o);
while (m!<(\w+)>(.?+)</\w+>!go) {
$data{$1} = $2;
}
}И вообще XML [руками] разбирать не стоит - есть более другие способы.