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
如果这是已知的或者我在这里遗漏了什么,请提出建议。
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 脚本中大到足以放入一个文件而不是一个衬里。也许那时也是。
print
和say
默认打印到标准输出;不需要 print STDOUT ...;
.
请参阅使用 say
而不是带有显式换行符的 print
。如果使用后者,请使用 print ..., "\n"
而不是字符串连接。
我正在使用 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
如果这是已知的或者我在这里遗漏了什么,请提出建议。
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 withsplice
. 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 脚本中大到足以放入一个文件而不是一个衬里。也许那时也是。print
和say
默认打印到标准输出;不需要print STDOUT ...;
.请参阅使用
say
而不是带有显式换行符的print
。如果使用后者,请使用print ..., "\n"
而不是字符串连接。