Предполага се, че следният фрагмент на 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
, когато @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)
Какво може да причини това поведение?