我想检查其他范围的范围。例如:
要检查:
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