我正在尝试生成一个多维哈希,其中包含一个键和与该键关联的两个值。这是我的示例输入文件
layer_def A1 10001;
layer_map 2 -datatype 2 10001;
layer_def A2 10002;
layer_map 3 -datatype 2 10002;
我想比较第一行的最后一个元素(第二个模式)和第二行的最后一个元素(第三个模式)(即10001和10001),如果它们相等则选择第一行的第一个模式和1& ;来自第二行的第二个模式将它们推入一个哈希,其键将是第一行的第一个模式,值将是第一个和第一个。来自第二线的第二个图案。后来想要使用这个哈希来生成像
这样的输出格式预期样本输出
A1 = layer( 2 type(2))
A2 = layer( 3 type(2))
我尝试使用以下示例代码,但似乎,我们无法将多个值分配给单个键。
sample perl code..
#!/usr/bin/perl -w
use strict();
my $inFile = shift @ARGV;
my %cdnsInt=();
my %layerInfo=();
my %outHash=();
open layerMap, $inFile or die "can't read $inFile \n";
while(my $line = <layerMap>) {
if( $line =~ /^\s*layer_map\s+(\S+)\s+-datatype\s+(\S+)\s+(\S+)\s*;/gi ) {
%layerInfo = ( $3 => [$1, $2]);
} elsif($line =~ /^\s*layer_def\s+(\S+)\s+(\S+)\s*;/gi ) {
$cdnsInt{$2}=$1;
}
}
for ( keys %layerInfo ) {
for my $tmp ( keys %cdnsInt ) {
if ( $_ eq $tmp ) {
push @{ $outHash{values %cdnsInt} }, (values %layerInfo );
}
}
}
有人可以帮我解决这个问题吗?
提前多多感谢。
此致 Divesh
答案 0 :(得分:1)
这会从头开始重置每行的哈希值:
%layerInfo = ( $3 => [$1, $2]);
尝试改为:
$layerInfo{$3}= [ $1, $2 ] ;
更好的是,如果你想在layerInfo
分配的同一行上更快地接近最终结果:
$outHash{cdnsInt{$3}}= [ $1, $2 ] ;
这会让你:
$outHash = {
'A1' => [
'2',
'2'
],
'A2' => [
'3',
'2'
]
};