如何通过perl匹配两个文件中的数字值

时间:2018-10-09 07:06:08

标签: arrays perl hash numbers match

我有两个用制表符分开的文本文件。
文件1:

 21             114352848          
  6             73853300       
 17             53191768      
 13             28008170          
 35             34642708  
 25             18912643  

file2:

ABHD17B  1     85806534    85893402    
ACAT2    1     49011742    49029143    
ACTN4    21    114352846   114428174    
ADGRG6   1     33969266    34107014        
AFDN     17    55435472    55536326       
AGTPBP1  6     73853296    74033587       
AHI1     13    28008167    28198117       
AIG1     35    34642706    34886059       
AKAP12   25    41614908    41711677        
AKAP7    25    69361015    69483139        
AKT2     16    113380376   113406769         
ALDH16A1  1    107032288   107047268  

输出:

ACTN4    21    114352846   114428174  
AGTPBP1  6     73853296    74033587  
AHI1     13    28008167    28198117    
AIG1     35    34642706    34886059    

我想按列进行正则表达式匹配。 首先,我要检查文件1中的第1列与文件2中的第2列是否匹配。如果是,则检查文件1中的第2列是否位于文件2中第3列和第4列之间的数字范围内。

我的perl代码:

#!/usr/bin/perl
use warnings;
use strict;
my %hash;
my @values;
my @value;
my $line;
my $min;
my $max;
open my $IN1, '<', 'file1.txt' or die $!;
while (<$IN1>) {
my @values = split;
my $line = $values[1];
undef $hash{$values[0]};
}
close $IN1;
open my $IN2, '<', 'file2.txt' or die $!;
while (<$IN2>) {
chomp;
my @value = split;
my $min = $value[2];
my $max = $value[3];
if (exists $hash{$value[1]}) {
if ($line >= $min && $line <= $max){
  print "$_\n";
   }
 }
}
close $IN2;

我不确定为什么我的代码不起作用。 我得到了警告: 在.pl第XX行的数字ge(> =)中使用未初始化的值$ line

然后,我想知道还有其他有效的方法可以编写此示例的脚本。

2 个答案:

答案 0 :(得分:5)

在第二个循环中根本没有使用变量$line。在第一个循环中,您声明另一个$line遮蔽外部变量。最好不要在超出实际需要的范围内声明变量。

#!/usr/bin/perl
use warnings;
use strict;

my %hash;
open my $IN1, '<', 'file1.txt' or die $!;
while (<$IN1>) {
    my @values = split;
    $hash{ $values[0] } = $values[1];
}

open my $IN2, '<', 'file2.txt' or die $!;
while (<$IN2>) {
    my @values = split;
    my ($min, $max) = @values[2, 3];
    print if exists $hash{ $values[1] }
          && $hash{ $values[1] } > $min
          && $hash{ $values[1] } < $max;
}

答案 1 :(得分:1)

除了该单个比较之外,您永远不会在第二个循环中分配或使用$line。它的目的是什么。您可能要改用$hash{ $value[1] }吗?