2010-12-15 196 views
2

Comment transmettre un élément de "tableau de hachages" dans la fonction en tant que tableau? Par exemple, je voulais passer tous les $link->{text} en tant que tableau dans la fonction sort()Comment puis-je transmettre tous les éléments de "tableau de hachage" en fonction sous la forme d'un tableau

#!/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); 
} 
+0

comment :) – DVK

Répondre

6

Si vous voulez trier vos liens par texte,

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

Si vous réellement voulez juste et trier le texte,

my @text = sort map $_->{text}, @array_of_links; 
+3

ysth: Vous pouvez ajouter une clause de secours si les champs de texte sont identiques. Je ferais quelque chose comme 'sort {lc ($ a -> {texte}) cmp lc ($ b -> {texte}) || $ a -> {url} cmp $ b -> {url}} 'mais bien alignés. – tchrist

3

Mieux vaut pécher par excès de attention et utiliser un analyseur HTML pour analyser 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;