从散列哈希中获取价值

时间:2013-07-15 12:26:11

标签: perl hash hash-of-hashes

我想从散列哈希得到价值,但我不知道。我的代码是:

sub test {
    my $filename = $_[0];
    open INFILE, ${filename} or die $!;
    my %hashCount;
    my @firstline = split('\t',<INFILE>);
    shift(@firstline);
    while (my $line = <INFILE>) 
    {
        my %temp;
        chomp($line);
        my @line = split('\t', $line);
        foreach my $cpt (1..$#line) {
            $temp{$firstline[$cpt-1]}=$line[$cpt];
        }
        $hashCount{$line[0]}={%temp};
    }
    return %hashCount;
}
sub get_hash_of_hash { 
    my $h = shift; 
    foreach my $key (keys %$h) { 
        if( ref $h->{$key}) { 
            get_hash_of_hash( $h->{$key} );
        } 
        else { 
            say $h->{$key};
        } 
    } 
}

当我显示我的哈希时:

$VAR10679 = 'M00967_43_1106_2493_14707';
$VAR10680 = {
          'A' => '1',
          'B' => '0',
          'C' => '1',
          'D' => '0',
          'E' => '0'
        };

我的第一个函数返回哈希哈希值,我用第二个函数得到我的特定值。 所以我希望得到这样的价值:

my %hashTest = test("FILE.txt"); get_hash_of_hash(%hashTest,"M00967_43_1106_2493_14707","A") //return value '1'

3 个答案:

答案 0 :(得分:1)

您的哈希值将references保留为哈希值。

您可以像这样访问它们:

$hashTest{'M00967_43_1106_2493_14707'}{'A'};

有关详细信息,请参阅perlref

答案 1 :(得分:1)

您可以访问

等嵌套元素
$hash{keyA}{keyB}

或者我们可以编写一个遍历数据结构的函数,比如

sub walk {
  my ($hashref, @keys) = @_;
  my $pointer = $hashref;
  for my $key (@keys) {
    if (exists $pointer->{$key}) {
      $pointer = $pointer->{$key};
    } else {
      die "No value at ", join "->", @keys;
    }
  }
  return $pointer;
}

可以像

一样使用
my %hash = (
  'M00967_43_1106_2493_14707' => {
      'A' => '1',
      'B' => '0',
      'C' => '1',
      'D' => '0',
      'E' => '0'
  },
);
say walk(\%hash, 'M00967_43_1106_2493_14707', 'A');

注意:使用Data :: Dumper时,将引用传递给Dump函数:

print Dump \%hash; # not print Dump %hash

这是显示正确数据结构的必要条件。

答案 2 :(得分:0)

使用此子程序..

sub get_hash_of_hash { 
        my $h = shift; 
        foreach my $key (keys %$h) { 
            if( ref $h->{$key}) { 
                get_hash_of_hash( $h->{$key} );
            } 
            else { 
                print $h->{$key};
            } 
        } 
    }