Perl - 在增量值列表中查找缺少的数字

时间:2016-12-21 14:16:18

标签: perl

我需要找到一种在大序列中找到无,一个或多个缺失值的方法(200,000多个)

从文档中提取值并将其放入文本文件中。 由于提取,值之间会有空格,因此可以使用以下内容:$str =~ s/^\s+|\s+$//g

提取看起来像这样(由2个,3个或4个空格分隔):

120000  120001    120003  120004  120005

是否有一种简单的方法可以直接从文本文件中提取这些值,并使用Perl查找任何缺失值?

谢谢!

2 个答案:

答案 0 :(得分:3)

  

是否有一种简单的方法可以直接从文本文件中提取这些值

最简单的方法就是这样做。它会删除所有空格以及提取数字

my @numbers = do{
    open my $fh, '<', 'document.txt' or die $!;
    local $/;
    <$fh> =~ /\d+/g;
};
  

并找到任何缺失值

有些人似乎认为只有部分帮助的答案完全没用。这是剩下的

我会使用类似Number::Range的模块,就像这样

它将@numbers数组直接传递给构造函数,然后使用rangeList方法获取所有连续子序列的开始和结束对。涵盖所有这些值的值范围是从第一个序列的开头到最后一个序列的结尾。这被构造为一个新的数组$all,并从中删除原始范围。这只留下了原始范围内的空白

use strict;
use warnings 'all';
use feature 'say';

use Number::Range;

my @numbers = do {
    open my $fh, '<', 'document.txt' or die $!;
    local $/;
    <$fh> =~ /\d+/g;
};

my $range = Number::Range->new(@numbers);

my @sections = $range->rangeList;
my $all = Number::Range->new("$sections[0][0]..$sections[-1][-1]");
$all->delrange($range->range);

say scalar $all->range;

输出

120002

答案 1 :(得分:2)

如果你只有整数,你可以迭代整个事物并保持最新的数字,然后检查当前的数字是否还有一个。我遗漏了解析。

use strict;
use warnings;

my @missing;
my $last;
while ( my $current = <DATA> ) {
    $last ||= $current - 1; # start out with one less than the first

    push @missing, $current unless $last + 1 == $current;
    $last = $current;
}

p @missing;
__DATA__
120000
120001
120003
120004
120005

您需要在循环内部初始化$last并将其设置为小于第一个数字的一​​个,否则您将始终包含第一个数字。

@missing将包含120003