2016-05-14 6 views
1

\ tで区切られたファイルで、chrXまたはchrYを持ち、4列目が陽性の行のみを印刷しようとしています。タブで区切られたファイルの行を選択する

入力

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); 
関連する問題