Poniższy fragment Perla ma na celu wydrukowanie pierwszych 5 elementów tablicy, do której odnosi się wartość skrótu, lub mniej, jeśli tablica jest krótsza.Nieoczekiwanie krótkie wycinki Perla
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";
}
Nie sądzę pierwszy grep defined
jest to konieczne, ale nie może wyrządzić żadnej szkody, a powinien on zagwarantować, że nie istnieją żadne niezdefiniowane członkowie array przed plaster. Drugi grep defined
jest usunięcie niezdefiniowanych elementów tablicy w wyniku slice
gdy @list
jest krótszy niż 5.
%groups
została wypełniona przez wielokrotnych wywołań:
$groups{$key} =() unless defined $groups{$key};
push @{$groups{$key}}, $value;
Większość czasu działa dobrze:
key1:
value1
value2
value3
value4
value5
(5 of 100)
Ale czasami - a ja nie pracowałem się, w jakich okolicznościach - widzę:
key2:
value1
(1 of 5)
key3:
value1
value2
(2 of 5)
Spodziewam długość listy drukowanej i x
z (x of y)
być min(5,y)
Co może być przyczyną takiego zachowania?
Ała! Czy istnieje wokół niego idiomatyczny (a przynajmniej zgrabny) sposób? – slim
Myślę o tym. ["bez autoworyzacji"] (http://search.cpan.org/perldoc?autovivification) niestety nie pomaga. – mob
'print" (", skalar @ slice," z ", skalar (grep defined, @list),") \ n ";' uzyskuje właściwe wyjście. Może zostawić jednak lukę dla przyszłych opiekunów. – slim