@lohmag

Текстовый файл открывается одной строкой, как парсить?

Надо пропарсить xml и выдернуть из него ip адреса формата 174.139.177.234
while (defined(my $line = $fh->getline()))
{
if ( $line =~ m/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})<\/ip>/) {
print "$1\n";
}
}
Но в перле xml открывается одной строкой, и попадает только первое совпадение, как быть?
  • Вопрос задан
  • 2892 просмотра
Решения вопроса 1
Slipeer
@Slipeer
Если на входе XML правильней всего воспользоваться соответствующим парсером.
Вот здесь хорошие примеры

На выходе из парсера будет хэш - останется поискать в нём ip адреса.

Ну а если неправильно и по-быстрому:
while (defined(my $line = $fh->getline())) {
while ( $line =~ m/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})<\/ip>/g) {
print "$1\n";
}
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@gangabass
Правильнее использовать парсер. Например, XML::LibXML:

use XML::LibXML;
use feature qw(say);

my $filename = "Sample.xml";

my $parser = XML::LibXML->new();
my $doc    = $parser->parse_file($filename);
my $root   = $doc->getDocumentElement;

foreach my $node ( $doc->findnodes('//ip') ) {
    my $value = $node->textContent();

    say $value;
}


По поводу XML::Simple
Создатель XML::Simple сам предлагает использовать XML::LibXML:
STATUS OF THIS MODULE

The use of this module in new code is discouraged. Other modules are available which provide more straightforward and consistent interfaces. In particular, XML::LibXML is highly recommended.

The major problems with this module are the large number of options and the arbitrary ways in which these options interact - often with unexpected results.

Patches with bug fixes and documentation fixes are welcome, but new features are unlikely to be added.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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