2016-11-20 68 views
0

我想爲具有基因轉錄本的文件創建唯一ID。每一行由transcript_id和intron格式組成:染色體:start_coord-end_coord:strand。 我的文件看起來像這樣:用於創建唯一ID的陣列散列

CUFF.59321  chr7:134136506-134143748:- 
CUFF.59321  chr7:134135655-134136337:- 
CUFF.59321  chr7:134134550-134135537:- 
CUFF.59321  chr7:134133872-134134471:- 
CUFF.59321  chr7:134133246-134133748:- 
CUFF.59321  chr7:134132814-134133138:- 
CUFF.57276  chr7:25163747-25164818:- 
CUFF.57276  chr7:25163469-25163569:- 

我想重複transcript_ids(第1列)相結合,啓動結束座標他們。 示例CUFF.57276:

CUFF.57276 chr7:25163747-25164818:25163469-25163569:- 

爲此我用陣列的散列。

#!/usr/bin/perl -w 

use strict; 

my $input_gtf = shift @ARGV or die $!; 

my %hash; 

open (FILE, "$input_gtf") or die $!; 
while (<FILE>) { 
    my $line = $_; 
    chomp $line; 
    my @array = split /:\s+/, $line; 
    my $cuff = $array[0]; 
    my @introns = $array[1]; 
    $hash{$cuff} = [@introns]; 
} 
foreach my $cuff(keys %hash) { 
    print "$cuff:${hash{$cuff}}\n"; 
} 

close FILE; 

但是我得到了以下的輸出:

CUFF.61092  chr8:67968840-67969614:-:ARRAY(0x16a8b10) 
CUFF.30258  chr19:16636489-16638890:-:ARRAY(0x15f3b00) 
CUFF.47340  chr4:85719262-85722802:-:ARRAY(0x2ae38599de90) 

我怎樣才能從可視化陣列(0x16a8b10)語句或類似的一個值?

回答

0

輸入中:之後沒有空格,所以$array[1]爲空。另外,你不想爲每一行覆蓋$hash{$cuff},你想把push的新範圍放到現有的數組中。 @{ ... }數組解引用,它將數組引用轉換爲它引用的數組。

這裏是我的版本的腳本:

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

my $input_gtf = shift or die $!; 

my %hash; 

open my $FILE, $input_gtf or die $!; 
while (my $line = <$FILE>) { 
    chomp $line; 
    my @array = split /:/, $line; 
    my ($cuff, $introns) = @array; 
    push @{ $hash{$cuff} }, $introns; 
} 
close $FILE; 

for my $cuff (keys %hash) { 
    print join ':', $cuff, @{ $hash{$cuff} }; 
    print "\n"; 
} 

我對代碼所做無關修改:

  • 使用詞法文件句柄。他們更安全,更容易傳遞。
  • 不需要使用$_只能將其存儲在不同的變量中。您可以直接將<>分配給變量。
+0

非常感謝!它完美的工作! –