下面的 Perl 片段应该打印由哈希值引用的数组的前 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
是去掉slice
when@list
小于5的结果中未定义的数组成员。
%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
从(x of y)
min(5,y)
什么可能导致这种行为?