perl拼接数组缺失项

perl splicing array missing entries

我正在使用 splice 将数组切割成多个部分。我正在使用 perl。对于下面的给定代码:

my @array = (1..10021);
my @mypart;
my $slice_size = 500;
foreach (@array) {
    @mypart = splice(@array, 0, $slice_size);
    print STDOUT scalar(@mypart). "\n";
}

结果如下所示:

% time ./splice_perf.pl
500
500
500
500
500
500
500
500
500
500
500
500
500
500
500
500
500
500
500
500
21
0.269u 0.039s 0:00.48 60.4% 0+0k 0+0io 0pf+0w

注意21在最后。

而如果我将数组大小更改为 [my @array = (1..10020);]

输出缺少最后一位数字,即 20。输出如下所示:

% time ./splice_perf.pl
500
500
500
500
500
500
500
500
500
500
500
500
500
500
500
500
500
500
500
500
0.260u 0.048s 0:00.38 78.9% 0+0k 0+0io 0pf+0w

如果这是已知的或者我在这里遗漏了什么,请提出建议。

来自 the documentation:

If any part of LIST is an array, foreach will get very confused if you add or remove elements within the loop body, for example with splice. So don't do that.

我怀疑这是你的问题。如果您改为使用 while 循环,如下所示:

#!/usr/bin/env perl
use warnings;
use strict;
use feature qw/say/;

my @array = (1..10020);
my $slice_size = 500;
while (@array) {
    my @mypart = splice(@array, 0, $slice_size);
    say scalar(@mypart);
}

打印出来的最后一行是 20,如您所料。


备注:

  • Always use warnings;use strict; 在 perl 脚本中大到足以放入一个文件而不是一个衬里。也许那时也是。

  • printsay默认打印到标准输出;不需要 print STDOUT ...;.

  • 请参阅使用 say 而不是带有显式换行符的 print。如果使用后者,请使用 print ..., "\n" 而不是字符串连接。