如何在Perl中包含范围内检查范围



我想检查其他范围的范围。例如:

要检查:

   check1: 10-50
   check2: 100-150
   check3: 500-600

检查的地方:

   range1: 49-100
   range2: 800-900

我想检查check1中的每个数字,如果range1或range2中的存在等等。如果存在任何数字,请打印范围。对于此处:range1中存在50中的50。范围1中存在100是check2。但是检查3在范围1或范围2中都不存在。如何实现?

我从4列中的数据开始这样开始:

#!/usr/bin/perl
use warnings;
use strict;
use v5.16;

my (@check1, @check2, @range1, @range2);
my $header = <DATA>;
foreach (<DATA>){
    chomp $_;
    my @columns = split "t", $_;

    #check (check1 to check2) in range (all range1 to range2) both inclusive
    #check 3631 5899 in all range1 to range2, if found print YES
    #check 3760 5630 in all range1 to range2, if found print YES
}
__DATA__
#check1 check2  range1  range2
3631    5899    4706    5095
3760    5630    5174    5326
3631    3913    7834    8989

这是我要处理的方式:

my @checks = (
        [qw(check1 10 50)],
        [qw(check2 100 150)],
        [qw(check3 500 600)]);
while (my $line = <DATA>) {
    my ($name, $min_r, $max_r) = split (' ', $line);
    print $name;
    foreach my $check (@checks) {
        print " $check->[0]" if overlap($min_r, $max_r, $check->[1], $check->[2]);
    }
    print "n";
}
sub overlap {
    my ($r1, $r2, $c1, $c2) = @_;
    return 1 if $r1 >= $c1 && $r1 <= $c2;
    return 1 if $r2 >= $c1 && $r2 <= $c2;
    return 1 if $r1 < $c1 && $r2 > $c2;
    return 0;
}
__DATA__
range1 49 100
range2 800 900

编辑:看来您不喜欢我的答案。这是使用奇怪的4列数据格式的另一个命题(我不明白为什么您会拥有相同数量的支票和范围),并扭转了您在答案之一中所说的检查和范围的作用。如果支票存在于其中一个范围中,我会打印一个是。如果您想要的是,如果在所有范围内都存在支票,则只需添加2个否定范围:

my @checks;
my @ranges;
my $header = <DATA>;
while (my $line = <DATA>) {
    my ($min_c, $max_c, $min_r, $max_r) = split (' ', $line);
    push @checks, [$min_c, $max_c];
    push @ranges, [$min_r, $max_r];
}
foreach my $check (@checks) {
    print "$check->[0] $check->[1] YESn"
        if grep {overlap($check->[0], $check->[1], $_->[0], $_->[1])} @ranges;
}
__DATA__
#check1 check2  range1  range2
3631    5899    4706    5095
3760    5630    5174    5326
3631    3913    7834    8989

最新更新