2015-03-11 7 views
0

Новый пользователь Perl.Perl - как сравнить значения массива с хэш-таблицей

Я пытаюсь создать хеш-таблицу из некоторых данных с разделителями табуляции, хранящихся в переменной $blast_results, с первым столбцом в качестве ключа. И затем я хочу сравнить значения в массиве @filenames с ключом в хеш-таблице. Если значение массива найдено в хэш-ключе, я хочу распечатать повторно упорядоченную структуру $blast_results, если значение массива не находится в хэше, я хочу распечатать значение, за которым следует «No Result Found».

Это то, что я до сих пор, я думаю, что хэш-таблица не является правильным:

#!/usr/bin/env perl 

use strict; 
use warnings; 
use Data:Dumper; 

#create variable to mimic blast results 
my $blast_results = "file1.ab1 9 350 0.0 449 418 418 403479 403042 567 
file3.ab1 2 833 0.0 895 877 877 3717226 3718105 984"; 

#create array to mimic filename array 
my @filenames = ("file1.ab1", "file2.ab1", "file3.ab1"); 

#header for file 
my $header = "Query\tSeq_length\tTarget found\tScore (Bits)\tExpect(E-value)\tAlign-length\tIdentities\tPositives\tChr\tStart\tEnd\n"; 

#initialize hash 
my %hash; 
#split blast results into array 
my @row = split(/\s+/, $blast_results); 
$hash{$row[0]}=$_; 
print $header; 
foreach my $file (@filenames){ 
    ## If this filename has an associated entry in the hash, print it in a re-ordered format 
    if(defined($hash{$file})){ 
     print "$row[0]\t$row[9]\t$row[1]:$row[7]-$row[8]\t$row[2]\t$row[3]\t$row[4]\t$row[5]\t$row[6]\t$row[1]\t$row[7]\t$row[8]\n"; 
     } 
    ## If not, print this. 
    else{ 
     print "$file\t0\tNo Blast Results: Sequencing Rxn Failed\n"; 
     } 
    } 
print "-----------------------------------\n";  
print "$blast_results\n"; #test what results look like 
print "-----------------------------------\n"; 
print "$row[0]\t$row[1]\n"; #test if array is getting split correctly 
print "-----------------------------------\n"; 
print "$filenames[2]\n"; #test if other array present 
print "-----------------------------------\n"; 
print Dumper(\%hash); #print out hash table 

Результат от этого сценария есть (@filenames массив не соответствует хэш и хэш не содержит все данных):

Query Seq_length Target found Score (Bits) Expect(E-value) Align-length Identities Positives Chr Start End 
file1.ab1 0 No Blast Results: Sequencing Rxn Failed 
file2.ab1 0 No Blast Results: Sequencing Rxn Failed 
file3.ab1 0 No Blast Results: Sequencing Rxn Failed 
----------------------------------- 
file1.ab1 9 350 0.0 449 418 418 403479 403042 567 
file3.ab1 2 833 0.0 895 877 877 3717226 3718105 984 
----------------------------------- 
file1.ab1 9 
----------------------------------- 
file3.ab1 
----------------------------------- 
$VAR1 = { 
     'file1.ab1' => undef 
     }; 

ответ

0

Вы делаете что-то очень странное только здесь:

my %hash; 
#split blast results into array 
my @row = split(/\s+/, $blast_results); 
$hash{$row[0]}=$_; 

Ваш хэш будет иметь один ключ - «file1.ab1» и ... Я не вижу, что будет $_, но это почти наверняка то, что вы хотите. (Из вашего выводов в конце, это undef.)

Ни в коем случае не вкладывайте что-либо в этот хэш, поэтому вы получаете результат, который вы делаете.

Есть ли случайно blast_results нормально читать из файла?

Если да, то, как это может работать:

use strict; 
use warnings; 
use Data::Dumper; 
my %hash; 

while (<DATA>) { 
    my @line  = split; 
    my $filename = shift(@line); 
    $hash{$filename} = join(" ", @line); 
} 

print Dumper \%hash; 


__DATA__ 
file1.ab1 9 350 0.0 449 418 418 403479 403042 567 
file3.ab1 2 833 0.0 895 877 877 3717226 3718105 984 

Если вы получаете результаты из команды вместо - почему бы не попробовать:

open (my $blast_results, "|-", "blastn -query test.fa -outfmt 6"); 
while (<$blast_results>) { 
    #parse line into hash 
} 
+0

да я пытался изменить что-то, где хэш был загружен из файла. Но я подумал, что было бы лучше просто написать файл в конце. Настоящий скрипт запускает функцию командной строки, подобную этой «my $ blast_result = blastn -query test.fa -outfmt 6;» Поэтому я думал, что можно просто использовать этот вывод в переменной для создания хеша, а затем обработать текстовый файл так, как я разыскивается. – jpalmer

+0

OK. Возможно, это будет задание для 'open', поэтому вы можете идти по строкам. См. Править. – Sobrique

+0

Итак, я запускал программу командной строки с обратными окнами, но вместо этого использование open позволит мне читать строки за строкой в ​​хеш-таблице? – jpalmer

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