【问题标题】:Perl - Split sorted array into two arrays based on valuesPerl - 根据值将排序数组拆分为两个数组
【发布时间】: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]。前者会给出非常奇怪的结果
  • 谢谢,后面的我改了。无论哪种方式都有效,但我确信第二种语法更好。

标签: arrays perl split


【解决方案1】:

只需检查相邻数字之间的差异。如果大于 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;
    }
}

【讨论】:

  • 我明白了,谢谢你的回答。我可以把“推@missing”放在哪里?这样缺失的值仍然会被推送到数组中?
  • “说”在哪里。 1
猜你喜欢
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 2018-06-17
  • 2011-06-15
相关资源
最近更新 更多