首页 > 解决方案 > perl拼接数组缺少条目

问题描述

我正在使用拼接将数组切割成部分。我正在使用 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

请建议这是否已知或我在这里遗漏任何东西。

标签: perl

解决方案


文档中

如果 LIST 的任何部分是一个数组,foreach如果您在循环体中添加或删除元素(例如使用splice. 所以不要那样做。

我怀疑这是你的问题。如果您改为使用 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与您预期的一样。


笔记:

  • 总是 use warnings;在 perl 脚本中use strict;大到可以放入一个文件而不是一个衬里。也许即使在那时也是如此。

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

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


推荐阅读