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
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
请建议这是否已知或我在这里遗漏任何东西。
解决方案
从文档中:
如果 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;
大到可以放入一个文件而不是一个衬里。也许即使在那时也是如此。print
并say
默认打印到标准输出;不需要print STDOUT ...;
。请参阅使用 of
say
而不是print
带有显式换行符的 a。如果使用后者,请使用print ..., "\n"
而不是字符串连接。
推荐阅读
- javascript - 如何避免 UglifyJS 在通过 html-minifier 忽略 Handlebars 占位符后添加额外的分号
- c# - 如何在文本块周围设置图像位置
- c# - 绑定对象列表时如何定义Column的类型(如超链接)?
- microsoft-graph-api - 自动开始在线会议 - Microsoft Teams
- r - 打印列中每个元素的百分比
- python - Django admin - 使用另一个模型的 ModelForm 添加额外的字段
- python - XGBoost - 每个阈值的准确度、精确度和召回率 + 每个时期的损失
- c++ - 使用 MSXML C++ 将另一个 XML 文件添加到现有 XML 文件
- django - 如何在 Django 中设置的 Ember.js 中获取 cookie(基本上我需要 jwt 令牌)?
- reactjs - 我如何使我的仪表板受保护组件(只有注册用户才能访问)。以及仪表板导航的工作原理