将嵌套哈希传递给子例程

时间:2016-07-07 13:42:11

标签: perl hash

我有一个多维哈希,如下所示:

my %hashTable;
$hashTable{'1'}{'A'} = "red";
$hashTable{'1'}{'B'} = "blue";
$hashTable{'2'}{'A'} = "orange";
$hashTable{'2'}{'B'} = "purple";

我想将内部哈希作为参数传递给子例程。 例如,

hashFunc($hashTable{'2'});

sub hashFunc{
     my %innerHash = $_[0];
}

但是,当我将该函数调用为hashFunc($hashTable{'2'})时,我收到错误

Reference found where even-sized list expected

如何正确提供内部哈希作为子例程的参数?

3 个答案:

答案 0 :(得分:4)

Perl哈希值必须是标量,并且使用引用为每个数组或哈希值使用哈希或数组构建嵌套数据结构

您需要在子例程中指定标量值,例如

hashFunc($hashTable{'2'});

sub hashFunc{
    my ($innerHash) = @_;
    # same as my $innerHash = $_[0]
    ...
}

您没有说明要对二级哈希做什么,但通常您可以使用$innerHash->{key}访问内部哈希的元素,或者您可以使用keysvalueseach运营商通过取消引用该值;例如for my $k ( keys %$innerHash ) { ... }

您应该查看Perl references short introductionPerl data structures intro了解更多信息

答案 1 :(得分:3)

通过参考汇集多维数据结构。

$hashtable{'2'}是一个标量值,它是对哈希的引用。

要在子程序中使用它,您需要取消引用它 - 在发送之前

hashFunc( %{$hashtable{'2'}});

将发送一个值列表(然后您可以将其分配到哈希中)。

哈希:

 my %innerHash = %{$_[0]};

然而正如Borodin指出的那样 - 这将导致您的数据结构被复制,这是低效的,很少需要。

所以你可以改为:

 my ( $innerHash ) = @_; 

然后您可以通过解除引用运算符访问$innerHash,例如:

 print $innerHash -> {'A'};
 foreach my $key ( keys %$innerHash ) { 
    print $key,"\n";
 }

等。

答案 2 :(得分:2)

如果需要将其用作哈希值,则需要取消引用内部哈希值。

您可以在子程序中执行此操作

hashFunc($hashTable{2});
sub hashFunc {
    my %innerHash = %{ $_[0] };

或在调用代码中

hashFunc(%{ $hashTable{2} });
sub hashFunc {
    my %innerHash = @_;

但是,您通常不需要使用哈希,您可以直接使用哈希引用。

hashFunc($hashTable{2});
sub hashFunc {
    my $innerHashRef = shift;
    # Whatever you need to do with the hash:
    $innerHashRef->{key}{A} = ... 
    for my $key (keys %$innerHashRef) {
    ...