Perl:foreach和sort

时间:2012-02-10 16:06:20

标签: perl sorting loops

我正在编写一个我需要对结果进行排序的小程序。基本上,我有一个foreach循环从子程序中获取数据。这是代码:

foreach $host (get_mirror_list()) {
    (my $ret, my $dur, my $ip) = $p->ping($host,2);
    my $duration = 1000 * $dur;
    my $results = printf("$host:%.2f\n", $duration) if $ret;
}

我需要知道如何在foreach语句中处理,然后将数据存储到hash或数组(不知道该怎么做),然后对部分数据进行排序。我对Perl很新,我只是在这里和那里涉猎。顺便说一下,foreach语句有效,我只是不知道如何进行排序和存储数据。

谢谢!

2 个答案:

答案 0 :(得分:1)

不太确定您要做什么,但以下内容应该从$p->ping获取结果并将它们填充到数组中,然后按主机显示它们。

...

my @results;

foreach my $host (get_mirror_list()) {
    my %ping_res = ( host => $host );

    @ping_res{qw{ ret dur ip }} = $p->ping($host, 2);

    push @results, \%ping_res;
}

foreach my $pr (sort { $$a{host} <=> $$b{host} } @results) {
    if ($$pr{ret}) {
        printf("%s:%.2f\n", $$pr{host}, 1000 * $$pr{dur});
    }
}
...

或者,如果您愿意,可以将结果放在哈希中:

...

my %results;

foreach my $host (get_mirror_list()) {
    my %ping_res;

    @ping_res{qw{ ret dur ip }} = $p->ping($host, 2);

    $results{$host} = \%ping_res;
}

foreach my $host (sort keys %results) {
    my $pr = $results{$host};

    if ($$pr{ret}) {
        printf("%s:%.2f\n", $host, 1000 * $$pr{dur});
    }
}
...

答案 1 :(得分:0)

您可以执行类似

的操作
use strict;
use warnings;
use 5.010;

my ($HOST, $RTT, $DUR, $IP) = ( 0 .. 3 );
my @slow_mirrors = sort { $b->[$RTT] <=> $a->[$RTT] } 
                   grep { $_->[$RTT] > .5 } 
                   map { [ $_, $p->ping($_, 2) ] } get_mirror_list();


for my $system (@slow_mirrors) {
    say "$system->[$HOST] ($system->[$IP]) is slow: $system->[$RTT] ms round trip time."
}