cat inputfile
A<b>Metabolism</b>
B
B <b>Overview</b>
C 01200 Carbon metabolism [PATH:ko01200]
D K00844 HK; hexokinase [EC:2.7.1.1]
D K12407 GCK; glucokinase [EC:2.7.1.2]
...
#
open KO,'<',"inputfile" or die $!;
my ($A,$B,$C,$D,$path_DESC,$KO_DESC);
my %K2ko; my %K2DESC; my %ko2desc;
while (<KO>) {
if (/^A<b>(.+)<\/b>/) {$A=$1;}
elsif (/^B\s+<b>(.+)<\/b>/) {$B=$1;}
elsif (/^C\s+\d+\s+(.+)\s+\[PATH:(ko\d+)\]/) {
$path_DESC=$1;
$C=$2;
$ko2desc{$C} = "$A\t$B\t$path_DESC";
}
elsif (/^D\s+(K\d+)\s+(.*)/) {
$D=$1;
$KO_DESC=$2;
$K2ko{$D}{$C} = 1;
$K2DESC{$D} = $KO_DESC;
}
}
close KO;
#
有没有人愿意告诉我&#34; $ K2ko {$ D} {$ C} = 1&#34;在perl脚本中做什么?
感谢您的任何建议。
答案 0 :(得分:3)
这称为hash of hashes,它为您提供多维哈希。这里,“1”是上述散列键的值。
尝试使用Data::Dumper了解数据结构。
use Data::Dumper;
my %K2ko;
my $D = "val1";
my $C = "val2";
$K2ko{$D}{$C} = 1;
print Dumper \%K2ko;
输出
$VAR1 = {
'val1' => {
'val2' => 1
}
};
答案 1 :(得分:2)
使用您的样本数据:
if (/^A<b>(.+)<\/b>/) {$A=$1;}
将$A
设置为'Metabolism'
elsif (/^B\s+<b>(.+)<\/b>/) {$B=$1;}
将$B
设置为'Overview'
elsif (/^C\s+\d+\s+(.+)\s+\[PATH:(ko\d+)\]/) {...}
将$path_DESC
设置为'Carbon metabolism'
,$C
设置为'ko01200'
和哈希
$ko2desc{'ko01200'} = "Metabolism\tOverview\tCarbon metabolism"
最后
elsif (/^D\s+(K\d+)\s+(.*)/) {...}
将设置
$D='K12407';
$KO_DESC='GCK; glucokinase [EC:2.7.1.2]';
$K2ko{'K12407'}{'ko01200'} = 1;
$K2DESC{'K12407'} = 'GCK; glucokinase [EC:2.7.1.2]';
$K2ko
是散列哈希值,将其设置为1,您可以轻松查看组件K12407
的使用位置:
print join ',', keys %{$K2ko{'K12407'}};