Как передать все элементы «массива хэшей» в функцию в виде массива - PullRequest
2 голосов
/ 16 декабря 2010

Как передать элемент «массива хэшей» в функцию в виде массива?

скажем, например, я хотел передать все $link->{text} в виде массива в функцию sort().

#!/usr/bin/perl
use strict; use warnings;

my $field = <<EOS;
<a href="baboon.html">Baboon</a>
<a href="antelope.html">Antelope</a>
<a href="dog.html">dog</a>
<a href="cat.html">cat</a>
EOS

#/ this comment is to unconfuse the SO syntax highlighter. 
my @array_of_links;
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);
}

Ответы [ 2 ]

6 голосов
/ 16 декабря 2010

Если вы хотите отсортировать ссылки по тексту,

my @sorted_links = sort { $a->{text} cmp $b->{text} } @array_of_links;

Если вы на самом деле просто хотите получить и отсортировать текст,

my @text = sort map $_->{text}, @array_of_links;
3 голосов
/ 16 декабря 2010

Лучше ошибиться с осторожностью и использовать анализатор HTML для анализа HTML:

use strict; use warnings;

use HTML::TokeParser::Simple;

my $field = <<EOS;
<a href="baboon.html">Baboon</a>
<a href="antelope.html">Antelope</a>
<a href="dog.html">dog</a>
<a href="cat.html">cat</a>
EOS

my $parser = HTML::TokeParser::Simple->new(string => $field);

my @urls;

while ( my $tag = $parser->get_tag ) {
    next unless $tag->is_start_tag('a');
    next unless defined(my $url = $tag->get_attr('href'));
    my $text = $parser->get_text('/a');
    push @urls, { url => $url, text => $text };
}

@urls = sort {
    $a->{text} cmp $b->{text} ||
    $a->{url}  cmp $b->{url}
} @urls;

use YAML;
print Dump \@urls;
...