Как мне распечатать массив в блоках и указать, сколько элементов в строке печатать?
#Given @array = qw/a b c d e f g i j/; $chr_per_line =3;
Выход:
a b c \n d e f \n g i j \n
Спасибо!
Вместо использования деструктивного splice для такого рода вещей я предпочитаю использовать natatime (N за раз) из List :: MoreUtils
splice
natatime
use List::MoreUtils 'natatime'; my @array = qw/a b c d e f g i j/; my $iter = natatime 3, @array; while( my @chunk = $iter->() ) { print join( ' ', @chunk ), "\n"; }
Использование сращивание :
while (@array) { print join " ", splice(@array, 0, $chr_per_line), "\n"; }
Это одна из многих задач списка, которые я рассмотрел в своем модуле List :: Gen
use List::Gen 'every'; my @array = qw(a b c d e f g h i); print "@$_\n" for every 3 => @array;
который печатает:
a b c d e f g h i
В отличие от natatime, фрагменты здесь остаются псевдонимами в списке источников:
$$_[0] = uc $$_[0] for every 3 => @array; print "@array\n"; # 'A b c D e f G h i'
Решение для сращивания также может быть записано:
while ( my @chunk = splice(@array, 0, $chr_per_line) ) { print join( ' ', @chunk, "\n" ); }
, что может быть более удобно, если вам нужно выполнить более одной операции в цикле.
Список :: MoreUtils :: natatime
use strict; use warnings; use List::MoreUtils qw(natatime); my @array = qw/a b c d e f g i j/; my $it = natatime(3, @array); while (my @vals = $it->()) { print "@vals\n"; } __END__ a b c d e f g i j
Это тоже работает
use strict; use warnings; my @array = qw/a b c d e f g i j/; my $chr_per_line =3; for (my ($i,$k)=(0,0); ($k+=$chr_per_line)<=@array; $i=$k) { print "@array[$i .. $k-1] \n"; } __END__