【发布时间】:2017-05-27 14:37:03
【问题描述】:
我对 Perl 还很陌生。
我有一大堆数字,首先排序:
my @numbers = do {
open my $fh, '<', glob("hotfolder/*.out") or die $!;
local $/;
<$fh> =~ /\d+/g;
};
my @sorted_numbers = sort { $a <=> $b } @numbers;
排序后的值现在位于 @sorted_numbers 数组中。 接下来它需要在这个数组中找到缺失的值:
my @missing;
my $i = 0;
for ( $sorted_numbers[ 0 ] .. $sorted_numbers[ -1 ] ) {
++$i, next if $_ == $sorted_numbers[ $i ];
push @missing, "$_\n";
}
这是我需要帮助的地方。我不确定如何实现下一步。 数组中的每个数字都以 2 (200000) 或 3 (300000) 开头。
缺失值应仅显示在这些范围之间。 假设第一个范围以 240000 结束。另一个范围将从 300000 以上开始。
当然,我不想将这两个范围之外的所有值都返回为缺失值。
我按照这些思路尝试了一些方法,但语法和逻辑完全错误:
foreach (my $step = @sorted_numbers) {
if ($step <= 299999) {
my $i = 0;
for ( $sorted_numbers[ 0 ] .. $sorted_numbers[ -1 ] ) {
++$i, next if $_ == $sorted_numbers[ $i ];
push @missing, "$_\n";
}
}
else ($step > 299999) {
my $i = 0;
for ( $sorted_numbers[ 0 ] .. $sorted_numbers[ -1 ] ) {
++$i, next if $_ == $sorted_numbers[ $i ];
push @missing2, "$_\n";
}
}
}
如果有什么不清楚的地方请告诉我,我很乐意提供更多信息。
【问题讨论】:
-
您能否提供一个说明性数据集(较小的数据集)以及所需的输出?我不确定我是否完全按照您的要求进行操作。您已经指出“下一步”存在问题,但我看不出“下一步”实际上是什么。
-
当然。例如,如果这是范围:269996 269998 269999 301002 301003 301004 301006 301007 这应该返回为仅缺少以下两个值并忽略大间隙:269997 301005
-
注意:
glob("hotfolder/*.out")应该是( glob("hotfolder/*.out") )[0]。前者会给出非常奇怪的结果 -
谢谢,后面的我改了。无论哪种方式都有效,但我确信第二种语法更好。