Ho scritto il modulo List::Gen su CPAN che fornisce un modo alternativo per fare questo:
use List::Gen qw/by/;
my @array = qw/zero one two three four five six/;
my @slice = map {$$_[0]} by 2 => @array;
by
partizioni @array
in gruppi di due elementi e restituisce una matrice di riferimenti di matrice. map
ottiene questo elenco, quindi ogni $_
nella mappa sarà un riferimento di matrice. $$_[0]
(che potrebbe anche essere scritto $_->[0]
) quindi acquisisce il primo elemento di ogni gruppo creato da by
.
Oppure, usando la funzione mapn
che by
usa internamente:
use List::Gen qw/mapn/;
my @slice = mapn {$_[0]} 2 => @array;
Oppure, se l'elenco sorgente è enorme e si può solo bisogno di alcuni elementi, è possibile utilizzare List::Gen
s' liste pigri:
use List::Gen qw/by gen/;
my $slicer = gen {$$_[0]} by 2 => @array;
$slicer
è ora una lista pigra (un array ref) che genererà le sue fette su richiesta senza elaborare tutto ciò che non hai richiesto. $slicer
ha anche una serie di metodi di accesso se non si desidera utilizzarlo come riferimento dell'array.
fonte
2010-10-13 16:16:55
Tieni presente che se hai un array vuoto, questo metodo aggiungerà un elemento (vuoto) ad esso (in modo che il nuovo array non sia più di dimensione 0). – insaner