Как использовать Perl для обработки и печати массива в виде кусков? - PullRequest
1 голос
/ 24 декабря 2010

Как мне распечатать массив в блоках и указать, сколько элементов в строке печатать?

#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

Спасибо!

Ответы [ 6 ]

6 голосов
/ 24 декабря 2010

Вместо использования деструктивного splice для такого рода вещей я предпочитаю использовать natatime (N за раз) из List :: MoreUtils

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";
}
4 голосов
/ 24 декабря 2010

Использование сращивание :

while (@array) {
    print join " ", splice(@array, 0, $chr_per_line), "\n";
}
3 голосов
/ 24 декабря 2010

Это одна из многих задач списка, которые я рассмотрел в своем модуле 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'
2 голосов
/ 24 декабря 2010

Решение для сращивания также может быть записано:

while ( my @chunk = splice(@array, 0, $chr_per_line) ) {
    print join( ' ', @chunk, "\n" );
}

, что может быть более удобно, если вам нужно выполнить более одной операции в цикле.

2 голосов
/ 24 декабря 2010

Список :: 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
0 голосов
/ 25 декабря 2010

Это тоже работает

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__  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...