我是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";
}
}
}
如果有什么不清楚,请告诉我,我很乐意提供进一步的信息。
答案 0 :(得分:4)
只需检查相邻号码之间的差异即可。如果它超过1但足够小(请参阅下面的$gap_size
),请报告缺少的数字:
#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
my $gap_size = 50; # Tune this to your needs.
my @numbers = sort { $a <=> $b } map /\d+/g, <>;
for my $i (1 .. $#numbers) {
my $diff = $numbers[$i] - $numbers[$i-1];
if ($diff > 1 && $diff < $gap_size) {
say for $numbers[$i-1] + 1 .. $numbers[$i] - 1;
}
}