Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
perl拼接数组缺少条目_Perl - Fatal编程技术网

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

我用剪接把一个阵列切成几部分。我正在使用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
请建议我是否知道这一点,或者我在这里遗漏了什么。

来自:

如果列表的任何部分是数组,
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
,与您预期的一样


注:

  • 始终使用警告
    使用严格足够大,可以放在一个文件中,而不是一行。也许那时也是

  • 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
,与您预期的一样


注:

  • 始终使用警告
    使用严格足够大,可以放在一个文件中,而不是一行。也许那时也是

  • print
    say
    默认打印到标准输出;不需要<代码>打印标准

  • 请参见使用,而不是使用显式换行符打印。如果使用后者,请使用
    print…,“\n”
    而不是字符串串联


为什么要使用
foreach
?为什么要使用
foreach
?肖恩,你提出了一个重要的观点。foreach在我这边是个错误。如果从打印改为打印,是否会影响性能?或者按照你的意见是安全的。我从来没有说过。谢谢你的更正
say
print
基本上是一样的,只是
say
包含了尾随换行符。这比显式添加换行符更简洁,Shawn,你说得很重要。foreach在我这边是个错误。如果从打印改为打印,是否会影响性能?或者按照你的意见是安全的。我从来没有说过。谢谢你的更正
say
print
基本上是一样的,只是
say
包含了尾随换行符。IMO,这比显式添加换行符更简洁。