2016-05-14 2 views
1

Я пытаюсь напечатать только строки с chrX или chrY и положительные в столбце 4 в файле, разделенном \ t.выберите строки в файле с разделителями табуляций

вход

1373 NM_016303  chrX +  103356451  10335846 
1059 NM_015666  chr20 +  62183024  62202754 
116  NM_015340  chr3 +  45388582  45548836 
10  NM_001206850 chrY -  14522607  14843968 

выход

1373 NM_016303  chrX +  103356451  10335846 

мой код

#!/usr/bin/perl 

use strict; 
use warnings; 

print "type in the path of the file\n"; 
my $file_name = <>; 
chomp($file_name); 

open (FILE, $file_name) or die "#!"; 

my @line; 
my @array1; 

while(<FILE>){ 
    @line = split(/\t/); 
    $array1[2]=$line[2]; 
    $array1[3]=$line[3]; 
} 
my $positive; 
my $chr; 

#select only positives 
if ($line[3] =~ m/\+/i) { 
    $positive = $array1[3]; 
} 
#only chrX or chrY 
elsif ($line[2] =~ m/chrX/i or $line[2] =~ m/chrY/i) { 
    $chr = $array1[2]; 
} 
else { 
    print "no chrY or chrX\n"; 
} 
print "$chr $positive\n"; 

close(FILE); 
exit; 

, но я получаю сообщение об ошибке

Use of uninitialized value $chr in concatenation (.) or string at file.pl line 34, <FILE> line 61287. 

Я пробовал некоторые изменения, но это была только печать

chrX + 

и не вся линия. Что я должен изменить? Благодарю.

ответ

0

Все ваши тесты должны быть внутри цикла while, а не снаружи. Вы используете слишком много переменных, которые кажутся бесполезными. Использование $_ сделает ваш код короче и читаем:

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

print "Type in the path of the file:\n"; 
my $filename = <>; 
chomp($filename); 

open my $fh, '<', $filename 
    or die "$!"; 

while(<$fh>) { 
    # split $_ (the current line) on whitespaces 
    my @fields = split; 
    # print $_ if the condition is true 
    print if ($fields[2] =~ /^chr[XY]$/ and $fields[3] eq "+"); 
} 

close($fh); 
Смежные вопросы