我该如何将一个任意大小的 Perl 数组分成数量不确定的较小数组,使得每个较小数组中的元素数量尽可能均等?原始数组不能被破坏。
use strict;
use warnings;
use Data::Dumper; # for debugging only
print Dumper(distribute(7, [1..30]));
# takes number+arrayref, returns ref to array of arrays
sub distribute {
my ($n, $array) = @_;
my @parts;
my $i = 0;
foreach my $elem (@$array) {
push @{ $parts[$i++ % $n] }, $elem;
};
return \@parts;
};
这保证了@parts中元素的数量只能相差一个。还有另一种解决方案,可以事先计算数字并使用切片:
push @parts, [ @$array[$offset..$offset+$chunk] ];
$offset += chunk;
# alter $chunk if needed.
use strict;
use warnings;
use List::MoreUtils qw(part);
use Data::Dumper;
my @array = 1..9;
my $partitions = 3;
my $i = 0;
print Dumper part {$partitions * $i++ / @array} @array;
use strict;
use warnings;
use List::MoreUtils qw(part);
use Data::Dumper;
my $i = 0;
my $numParts = 2;
my @part = part { $i++ % $numParts } 1 .. 30;
print Dumper @part;
@Dallaylaen的回答不太适用,因为在Perl中无法将数组传递到子例程中。相反,您必须传递对数组的引用(或者像Dallaylaen在示例中所做的那样传递列表):
my @arrayIn = (1..30);
my @arrayOfArrays = distribute(7, \@arrayIn);
sub distribute {
my ($n, $array) = @_;
my @parts;
my $i = 0;
foreach my $elem (@$array) {
push @{ $parts[$i++ % $n] }, $elem;
};
return @parts;
};
natatime
,但是除了手动完成整个过程外,我无法想出更好的方法。 - Dallaylaen