Я думаю, что вы хотите это:
#!/usr/bin/perl
use strict;
use warnings;
my @array_of_links;
my $field = <<EOS;
<a href="foo.html">foo</a>
<a href="bar.html">bar</a>
<a href="baz.html">baz</a>
EOS
#/ this comment is to unconfuse the SO syntax highlighter.
while ($field =~ m{<a.*?href="(.*?)".*?>(.*?)</a>}g) {
push @array_of_links, { url => $1, text => $2 };
}
for my $link (@array_of_links) {
print qq("$link->{text}" goes to -> "$link->{url}"\n);
}
Модификатор /o
regex ничего не делает, если в него не интерполируются никакие строки (и, вероятно, его даже не следует использовать из-за его удивительного поведения),Модификатор /m
regex ничего не делает, потому что в вашем регулярном выражении нет якорей ^
или $
.
Вы не можете создать массив хэшей таким образом.Возможно, вы захотите перечитать циклы perldoc perldsc
.
C-Style for
, как правило, не требуются в Perl 5. Итерация цикла for
намного лучше.Если вам нужно знать индекс в массиве, вы должны использовать оператор диапазона:
for my $i (0 .. $#array_of_links) {
print qq($i. "$array_of_links[$i]{text}" goes to -> "$array_of_links[$i]{url}"\n);
}
Perl 5 позволяет вам выбирать свои собственные разделители для строк и регулярных выражений, если вы используете их общие формы (например, m//
для регулярных выражений и qq//
для двойных кавычек).Вы можете использовать это, чтобы избежать необходимости использовать уродливые экранированные символы, затрудняющие чтение строк и регулярных выражений.
Однако, похоже, вы пытаетесь использовать регулярное выражение для разбора HTML.Это путь, который заполнен болью .Вы действительно должны изучить , как использовать вместо этого анализатор .