Perl - 如何比较数组的值与哈希表

时间:2015-03-11 15:32:56

标签: perl

新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
        };

1 个答案:

答案 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
}
相关问题