我正在编写一个我需要对结果进行排序的小程序。基本上,我有一个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
语句有效,我只是不知道如何进行排序和存储数据。
谢谢!
答案 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."
}