我想填充散列哈希作为矩阵。我的数据中有5个ID;每行都以我分析过的行中第一个字段的IDsm开头。这些ID将是我想要构建的矩阵的列名称。为了填充矩阵,我计算这些ID与其他记录(在解析线的最后一个字段中由;
分隔的物种名称)的关联数。我的代码如下。你能告诉我这段代码出了什么问题吗?打印哈希散列作为矩阵
获得的结果是错误的(结果为%hashorganism
);我确认通过检查输入文件或与另外的哈希校验(%check
在下面的代码)
我的输入的例子是在这里(请忽略COLS 2 3 4和5中,它们并不重要):
A1 4 5 6 7 sp1;sp2;sp3;sp4
A2 4 5 6 7 sp5
A4 4 5 6 7 sp1;sp2;sp3
A5 4 5 6 7 sp6
A3 4 5 6 7 sp1;sp2
A3 4 5 6 7 sp1
A4 4 5 6 7 sp2;sp4
A3 4 5 6 7 sp1;sp2;sp3;sp5
预期矩阵是在这里:
A1 A2 A3 A4 A5
sp1 1 0 3 1 0
sp2 1 0 2 2 0
sp3 1 0 1 1 0
sp4 1 0 0 1 0
sp5 1 1 0 0 0
sp6 0 0 0 0 1
我的代码是在这里:
#!/usr/bin/perl
use warnings;
use strict;
use integer;
use Text::Table;
open(MAP, "<$ARGV[0]") || die "Problem in file opening : $ARGV[0]: $!\n";
my %hashorganism;
my %check;
my @IDS = ("A1", "A2", "A3", "A4", "A5");
my $j = 0;
while (my $line = <MAP>) {
chomp($line);
if ($line ne "") {
my @tempo = split(/\t/, $line);
$tempo[$#tempo] =~ s/^\s//;
$tempo[$#tempo] =~ s/\s$//;
#print $tempo[$#tempo] , "\n" ;
if ($tempo[1] >= 4 and $tempo[2] >= 5 and $tempo[3] >= 6)
{ ## && $tempo[$10] >= $evalue
$j++;
my $la = $tempo[0];
#print $tempo[$#tempo], " **\n";
if ($tempo[$#tempo] =~ /\;/) {
#print $line, "\n" ;
#print $line, "\n" ;
my @multiorg = split(/\;/, $tempo[$#tempo]);
foreach my $specie (@multiorg) {
$check{$specie}++;
$hashorganism{$specie}{$la}++;
## $hashorganism{$la."|".$specie}++ ;
foreach my $e (@IDS) {
if ($e ne $la) {
# print $e, "\n";
## $hashorganism{$e."|".$specie}=0;
$hashorganism{$specie}{$e} = 0;
}
#else {print $la, "\n";}
}
}
}
elsif ($tempo[$#tempo] !~ /\;/) {
$check{ $tempo[$#tempo] }++;
$hashorganism{ $tempo[$#tempo] }{$la}++;
##$hashorganism{$la."|".$tempo[$#tempo]}++;
foreach my $l (@IDS) {
if ($l ne $la) {
#print $l, "\n";
$hashorganism{ $tempo[$#tempo] }{$l} = 0;
#$hashorganism{$l."|".$tempo[$#tempo]}=0;
}
#else {print $lake, "\n";}
}
} else {
print $line, "something going wrong in your data\n";
}
}
}
}
print "The number of parsed lines : $j \n";
# print the whole hash of hashes
print "\tA1\t", "A2\t", "A3\t", "A4\t", "A5\n";
my $count = 0;
foreach my $org (sort keys %hashorganism) {
print $org, "\t";
foreach $_ (sort keys %{ $hashorganism{$org} }) {
print "$hashorganism{$org}{$_}\t";
}
print "\n";
}
foreach my $sp (sort keys %check) {
print $sp, "\t $check{$sp}\n";
}
非常感谢!它的工作原理 – user3064106 2014-10-20 04:05:18