如何将Perl数组分割成较小的数组?

3

是否有Perl中等价于php的array_chunk()的函数?

我正在尝试将一个大数组分成几个较小的数组。

谢谢您提前。

4个回答

15

谢谢。这真的很有帮助。从PHP转到Perl并不是一件容易的工作 :) - Antonio Lopes
5
@安东尼奥:这不是一项容易的工作,但它真的很值得! :) - sebthebert
为什么这不是一项容易的工作? - damog
请查看List::MoreUtils中的n-at-a-time(natatime)函数实现,该函数使用splice和匿名函数。 - ericslaw

8
您可以像这样使用数组切片:
#!/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

为了匹配 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
其中一种更简单的方法是使用 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 );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接