【发布时间】:2013-05-02 21:05:47
【问题描述】:
Perl 的以下 sn-p 应该打印由哈希值引用的数组的前 5 项,如果数组较短,则打印更少。
while ( my ($key,$value) = each %groups ) {
print "$key: \n";
my @list = grep defined, @{$value};
my @slice = grep defined, @list[0..4];
foreach my $item ( @slice ) {
print " $item \n";
}
print " (", scalar @slice, " of ", scalar @list, ")\n";
}
我不认为第一个grep defined是必要的,但它不会造成任何伤害,它应该保证切片之前没有未定义的数组成员。第二个grep defined是当@list小于5时,删除slice结果中未定义的数组成员。
%groups 已通过重复调用填充:
$groups{$key} = () unless defined $groups{$key};
push @{$groups{$key}}, $value;
大部分时间都可以正常工作:
key1:
value1
value2
value3
value4
value5
(5 of 100)
但有时——我还没有弄清楚在什么情况下——我明白了:
key2:
value1
(1 of 5)
key3:
value1
value2
(2 of 5)
我希望打印列表的长度,以及来自(x of y) 的x 是min(5,y)
什么可能导致这种行为?
【问题讨论】: