Как я могу разделить массив Perl на меньшие массивы? - PullRequest
3 голосов
/ 14 января 2010

Есть ли какой-нибудь Perl-эквивалент для php's array_chunk () ?

Я пытаюсь разделить большой массив на несколько меньших.

Заранее спасибо.

Ответы [ 4 ]

14 голосов
/ 14 января 2010
8 голосов
/ 14 января 2010

Вы можете использовать фрагменты массива следующим образом:

#!/bin/perl -l

my @array = (1,2,3,4,5,6,7,8,9);

print join ",", @array[0..2];
print join ",", @array[3..5];
print join ",", @array[6..$#array];
3 голосов
/ 14 января 2010

Для соответствия функции PHP вы можете использовать несколько подходов:

use strict;
use warnings;

use List::MoreUtils qw( natatime part );

use Data::Dumper;

my @array = 0..9;
my $size = 3;

{    my $i = 0;
     my @part = part { int( $i++ / $size ) } @array;
     warn "PART\n";
     warn Dumper \@part;
}

{    my $iter = natatime( $size, @array );
     my @natatime;
     while( my @chunk = $iter->() ) {
        push @natatime, \@chunk;
     }
     warn "NATATIME\n";
     warn Dumper \@natatime;
}

{    my @manual;
     my $i = 0;

     for( 0..$#array ) {
         my $row = int( $_ / $size );

         $manual[$row] = [] 
             unless exists $manual[$row];

         push @{$manual[$row]}, $array[$_];
     }

     warn "MANUAL:\n";
     warn Dumper \@manual;
}
2 голосов
/ 15 января 2010

Один из самых простых способов - использовать функции List::MoreUtils и natatime или part.

С помощью natatime он создает итератор, поэтому это может быть не то, что вам нужно:

my $iter = natatime 3, @orig_list;

И каждый вызов $iter->() возвращает 3 элемента в списке.

Тогда есть part.

my $i      = 0;
my @groups = part { int( $i++ / 3 ) } @orig_array;

Если вы хотите сделать это проще, вы можете написать свою собственную функцию: chunk_array.

sub chunk_array { 
    my $size = shift;
    my $i    = 0;
    return part { int( $i++ / $size ) } @_;
}

И вы бы назвали это так просто:

my @trios = chunk_array( 3, @orig_array );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...