2016-11-20 2 views
0

Я хочу создать уникальные идентификаторы для файла с транскриптами гена. Каждая строка состоит из transcript_id и intron, скоординированных в формате: chromosome: start_coord-end_coord: strand. Мой файл выглядит следующим образом:хэш массивов для создания уникальных идентификаторов

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) 

Как я могу визуализировать значения из ARRAY (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

Большое спасибо! Он отлично работает! –

Смежные вопросы