Новый пользователь 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
};
да я пытался изменить что-то, где хэш был загружен из файла. Но я подумал, что было бы лучше просто написать файл в конце. Настоящий скрипт запускает функцию командной строки, подобную этой «my $ blast_result = blastn -query test.fa -outfmt 6;» Поэтому я думал, что можно просто использовать этот вывод в переменной для создания хеша, а затем обработать текстовый файл так, как я разыскивается. – jpalmer
OK. Возможно, это будет задание для 'open', поэтому вы можете идти по строкам. См. Править. – Sobrique
Итак, я запускал программу командной строки с обратными окнами, но вместо этого использование open позволит мне читать строки за строкой в хеш-таблице? – jpalmer