生成一个多维哈希,其中包含一个键和与该键关联的两个值

时间:2013-12-12 05:14:29

标签: arrays perl hash multidimensional-array

我正在尝试生成一个多维哈希,其中包含一个键和与该键关联的两个值。这是我的示例输入文件

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

1 个答案:

答案 0 :(得分:1)

这会从头开始重置每行的哈希值:

%layerInfo = ( $3 => [$1, $2]);

尝试改为:

$layerInfo{$3}= [ $1, $2 ] ;

更好的是,如果你想在layerInfo分配的同一行上更快地接近最终结果:

$outHash{cdnsInt{$3}}= [ $1, $2 ] ;

这会让你:

$outHash = {
          'A1' => [
                    '2',
                    '2'
                  ],
          'A2' => [
                    '3',
                    '2'
                  ]
        };