2010-12-15 7 views
2

"ハッシュの配列"の要素を配列として機能させるにはどうすればいいですか?"ハッシュの配列"のすべての要素を配列として機能させるにはどうすればいいですか?

例えば、私はすべて$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); 
} 
+0

+1コメント: – DVK

答えて

6

テキストであなたのリンクをソートしたい場合は、

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

あなたが実際にはテキストを取得し、ソートしたい場合は、の側に誤ることが

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

ysth:テキストフィールドが同じ場合に備えて、フォールバック句を追加できます。 'sort {lc($ a - > {text})cmp lc($ b - > {text})のようなことをします。 $ a - > {url} cmp $ b - > {url}} 'しかし、うまく整列しています。 – tchrist

3

ベター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; 
関連する問題