在Perl中取消引用散列哈希值

时间:2012-09-27 10:30:08

标签: perl hash

我正在尝试收集存储在散列哈希值中的值,但我对perl如何做到这一点感到困惑。所以,我创建哈希哈希如下:

 my %hash;
 my @items;

 #... some code missing here, generally I'm just populating the @items list 
 #with $currentitem items

 while (<FILE>) { #read the file

         ($a, $b) = split(/\s+/,$_,-1);
         $hash{$currentitem} => {$a => $b};
         print $hash{$currentitem}{$a} . "\n";#this is a test and it works
}

以上代码似乎有效。现在,重点:我有一个数组@items,它保留$ currentitem值。我想做这样的事情:

@test = keys %hash{ $items[$num] };

这样我就可以获得特定项目的所有键/值对。我已经尝试过上面的代码行,以及

 while ( ($key, $value) = each( $hash{$items[$num]} ) ) {

      print "$key, $value\n";
 }

我甚至尝试按如下方式填充哈希:

$host{ "$currentcustomer" }{"$a"} => "$b";

根据我遇到的各种在线资源,这似乎更正确。但是,我仍然无法访问该哈希中的数据......有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我很困惑你说这有效:

$hash{$currentitem} => {$a => $b};

这应该不起作用(并不适合我)。 =>运算符是一种特殊的逗号,而不是赋值(请参阅perlop)。此外,右侧的构造会生成一个新的匿名哈希。使用它,新的匿名哈希将覆盖您尝试添加的每个元素的旧哈希。每个$currentitem只能有一个元素。

以下是您要分配的内容:

$hash{$currentitem}{$a} = $b;

以下是获取密钥的方法:

keys %{ $hash{ $items[$num] } };

我建议您阅读Perl references以便更好地处理此问题。一开始语法可能有点棘手。

答案 1 :(得分:1)

长答案在perldoc perldsc

简短回答是:

keys %{ $expr_producing_hash_ref };

在你的情况下,我相信它是

keys %{ $hash{$items[$num]} };