как сопоставить числовые значения из двух файлов по perl - PullRequest
0 голосов
/ 09 октября 2018

У меня есть два текстовых файла, разделенных табуляцией.
Файл 1:

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

Файл2:

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. Если да, то проверьте столбец 2 из файла 1, находится ли расположение в диапазоне номеров между столбцом 3 и столбцом 4 в файле 2.

мой код 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;

Я не уверен, почему мой код не работает.Я получил предупреждение: использование неинициализированной строки значения $ в числовом ge (> =) в строке .pl XX

Затем я хотел бы знать, есть ли другой эффективный способ написания сценариев для этого примера.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Переменная $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;
}
0 голосов
/ 09 октября 2018

Вы никогда не назначаете или не используете $line во втором цикле, за исключением этого одиночного сравнения.Какова его цель.Возможно, вы хотите использовать $hash{ $value[1] } вместо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...