我正在使用 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";
}
Run Code Online (Sandbox Code Playgroud)
结果如下:
% 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
Run Code Online (Sandbox Code Playgroud)
请注意,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
Run Code Online (Sandbox Code Playgroud)
请建议这是已知的还是我在这里遗漏了什么。
从文档:
如果 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);
}
Run Code Online (Sandbox Code Playgroud)
打印出来的最后一行20就像你期望的那样。
笔记:
总是 use warnings;和use strict;在Perl脚本足够大的去在一个文件,而不是一个衬垫。也许即使如此。
print并say默认打印到标准输出;不需要print STDOUT ...;。
请参阅使用 ofsay而不是 aprint与显式换行符。如果使用后者,请使用print ..., "\n"代替字符串连接。
| 归档时间: |
|
| 查看次数: |
45 次 |
| 最近记录: |