如何在Perl中以不均匀的批次拆分数组

See*_*hor 0 arrays perl

我试图将一个数组分成500个批次,但我想覆盖数组大小不均匀除以500的情况.例如:

Array = [1,...,1100]
subArray1 = [1..500]
subArray2 = [500..1000]
subArray3 = [1000..1100]
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止:

my @array = [prepopulated];
my $array_size = scalar(@array);
my $start = 0;
my $end = 500;

while ($start < $array_size) {
    my @subArray = @array[$start..$end];
    print Dumper(\@subArray);
    $start = $end;
    if($end + 500 > $array_size) {
        $end = $start + ($array_size % 500);
    } else {
        $end += 500;
    }
}
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但有没有更好的方法来做到这一点,或者在某些情况下,我没有看到这种情况?

wol*_*ats 6

List::MoreUtils 涵盖了这种任务:

use strict; use warnings;
use List::MoreUtils qw(natatime);

my @Array = (1..1100);
my $it = natatime 500, @Array;
while (my @vals = $it->()) {
    printf "%d\n", 0+@vals;
}
Run Code Online (Sandbox Code Playgroud)
500
500
100
Run Code Online (Sandbox Code Playgroud)

无需重新发明轮子.


Mat*_*cob 5

我认为splice会更简单,更干净:

use strict;
use warnings;

my @array = (1 .. 1100);
my $batch_size = 500;

while (@array) {
    my @batch = splice(@array, 0, $batch_size);
    # ...
}
Run Code Online (Sandbox Code Playgroud)

  • 只要您对清空原始数组没问题 (2认同)