Perl - 根据值将数组拆分为两个数组

时间:2017-01-12 13:05:21

标签: arrays perl split

我是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"; 
                    }
        }
    }

如果有什么不清楚,请告诉我,我很乐意提供进一步的信息。

1 个答案:

答案 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;
    }
}
相关问题