Я написал модуль List :: Gen на CPAN, который предоставляет альтернативный способ сделать это:
use List::Gen qw/by/;
my @array = qw/zero one two three four five six/;
my @slice = map {$$_[0]} by 2 => @array;
by
разбиений @array
на группы по дваэлементы и возвращает массив ссылок на массив.map
затем получает этот список, поэтому каждый $_
на карте будет ссылкой на массив.$$_[0]
(который также может быть записан $_->[0]
) затем захватывает первый элемент каждой группы, созданной by
.
Или, используя функцию mapn
, которая by
использует внутренне:
use List::Gen qw/mapn/;
my @slice = mapn {$_[0]} 2 => @array;
Или, если ваш список источников огромен и вам могут понадобиться только определенные элементы, вы можете использовать ленивые списки List::Gen
:
use List::Gen qw/by gen/;
my $slicer = gen {$$_[0]} by 2 => @array;
$slicer
теперь ленивыйlist (ссылка на массив), который будет генерировать его фрагменты по требованию, не обрабатывая ничего, о чем вы не просили.$slicer
также имеет несколько методов доступа, если вы не хотите использовать его как массив. Ref.