perl拼接数组缺少条目
我用剪接把一个阵列切成几部分。我正在使用perl。对于以下给定代码:perl拼接数组缺少条目,perl,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
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
请建议我是否知道这一点,或者我在这里遗漏了什么。来自:
如果列表的任何部分是数组,foreach
如果在循环体中添加或删除元素,例如使用splice
,将非常混乱。所以不要那样做
我想这是你的问题。如果改为使用while循环,如下所示:
#/usr/bin/env perl
使用警告;
严格使用;
使用功能qw/say/;
my@array=(1..10020);
我的$slice_size=500;
while(@array){
my@mypart=拼接(@array,0,$slice\u size);
表示标量(@mypart);
}
打印出来的最后一行是20
,与您预期的一样
注:
- 始终使用警告代码>和
使用严格在perl脚本中,代码>足够大,可以放在一个文件中,而不是一行。也许那时也是
和print
默认打印到标准输出;不需要<代码>打印标准代码>say
- 请参见使用,而不是使用显式换行符打印。如果使用后者,请使用
而不是字符串串联print…,“\n”
foreach
如果在循环体中添加或删除元素,例如使用splice
,将非常混乱。所以不要那样做
我想这是你的问题。如果改为使用while循环,如下所示:
#/usr/bin/env perl
使用警告;
严格使用;
使用功能qw/say/;
my@array=(1..10020);
我的$slice_size=500;
while(@array){
my@mypart=拼接(@array,0,$slice\u size);
表示标量(@mypart);
}
打印出来的最后一行是20
,与您预期的一样
注:
- 始终使用警告代码>和
使用严格在perl脚本中,代码>足够大,可以放在一个文件中,而不是一行。也许那时也是
和print
默认打印到标准输出;不需要<代码>打印标准代码>say
- 请参见使用,而不是使用显式换行符打印。如果使用后者,请使用
而不是字符串串联print…,“\n”
foreach
?为什么要使用foreach
?肖恩,你提出了一个重要的观点。foreach在我这边是个错误。如果从打印改为打印,是否会影响性能?或者按照你的意见是安全的。我从来没有说过。谢谢你的更正say
和print
基本上是一样的,只是say
包含了尾随换行符。这比显式添加换行符更简洁,Shawn,你说得很重要。foreach在我这边是个错误。如果从打印改为打印,是否会影响性能?或者按照你的意见是安全的。我从来没有说过。谢谢你的更正say
和print
基本上是一样的,只是say
包含了尾随换行符。IMO,这比显式添加换行符更简洁。