新Perl用户。
我正在尝试从存储在变量$blast_results
中的一些制表符分隔数据创建一个哈希表,第一列作为键。然后我想将数组@filenames
中的值与哈希表中的键进行比较。如果在散列键中找到数组值,我想打印出$blast_results
的重新排序结构,如果数组值不在散列中,我想打印出值后跟'否找到结果'。
这是我到目前为止,我认为哈希表不正确:
#!/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 :(得分: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
}