Perl: foreach и сортировка - PullRequest
       30

Perl: foreach и сортировка

2 голосов
/ 10 февраля 2012

Я пишу небольшую программу, в которой мне нужно отсортировать результаты. По сути, у меня есть цикл 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 ]

1 голос
/ 10 февраля 2012

Не совсем уверен, что вы пытаетесь сделать, но следующее должно взять результаты из $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});
    }
}
...
0 голосов
/ 10 февраля 2012

Вы могли бы сделать что-то вроде

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."
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...