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

时间:2018-03-28 22:57:45

标签: arrays perl

我正在尝试将数组拆分为500个批次,但我想要涵盖数组大小不均匀除以500的情况。例如:

Array = [1,...,1100]
subArray1 = [1..500]
subArray2 = [500..1000]
subArray3 = [1000..1100]

这是我到目前为止所做的:

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;
    }
}

这似乎有效,但有没有更好的方法可以做到这一点,或者在我看不到的情况下这是否会中断?

4 个答案:

答案 0 :(得分:6)

builder.RegisterAssemblyTypes(typeof(UserService).GetTypeInfo().Assembly) .Where(t => t.Name.EndsWith("Service") || t.Name.EndsWith("Repo")) .AsImplementedInterfaces() .SingleInstance(); 涵盖了这类任务:

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;
}

无需重新发明轮子。

答案 1 :(得分:3)

我认为splice会更简单,更清洁:

mediastreamvalidator

答案 2 :(得分:3)

请注意,perl的range运营商start..end包含双方。 0..500为您提供:0, 1, ..., 499, 500

假设您不想复制边界元素(例如,包含在两个子数组中的索引500),请尝试以下操作。

要点:

  • $end初始化更改为499
  • 在循环集$start = $end+1
  • 在检查新结尾是否溢出时,请改为使用>=$end + 500 >= $array_size

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

while ($start < $array_size) {
    my @subArray = @array[$start..$end];
    print Dumper(\@subArray);
    $start = $end+1;
    if($end + 500 >= $array_size) {
        $end = $array_size-1;
    } else {
        $end += 500;
    }
}

答案 3 :(得分:2)

natatime创建第二个索引数组非常浪费。

use List::Util qw( min );

for (my $start=0; $start<@array; $start+=500) {
    my $end = min($start+500, 0+@array);
    ...
}