在perl中使用哈希哈希问题

时间:2017-02-08 15:51:11

标签: perl hash

有人可以帮我解决下面的代码。

sub test
  { 
    %hs=@_;
    print %hs;
    print "\n";
    print $hs{'c'}."\n";
    print $hs{'d'}."\n";
    # print "\n";
    print $hs{'e'}{'game'}; # Not getting the output for this step. it should be 12 ? 
    print "\n";
    #print ${$hs{'e'}}{'dv'};
      foreach $key (sort keys %hs)
        {
          print $key."\n";
        }
    }


%hash=('game'=>'12','gh'=>'31');

print $hash{'game'}."\n";

test(c=>'123',d=>'345',e=>"%hash");

输出

12
e%hashc123d345
123
345

c
d
e
Press any key to continue . . .

print $hs{'e'}{'game'}给我null。请告诉我如何访问哈希的哈希。

谢谢你的进步。

此致 Sujeet

1 个答案:

答案 0 :(得分:4)

您应该在所有Perl程序中始终 use strictuse warnings。启用它们会显示此错误(在使用my声明变量之后)。

  

不能使用字符串("%hash")作为HASH参考,而#34; strict refs"在使用中

有问题的一行正是您所想的那条。

print $hs{'e'}{'game'};

但现在很容易发现。

test( c => '123', d => '345', e => "%hash" );

您正试图以某种方式插入变量%hash。或许您只是想到了如何制作更具维度的数据结构。

要将哈希放入哈希,您需要在Perl中使用引用。您可以使用%hash引用运算符为\创建引用。

test( c => '123', d => '345', e => \%hash );

试试吧。我删除了与之无关的代码。

sub test {
    my %hs = @_;

    print $hs{'e'}{'game'};
}

my %hash = ( 'game' => '12', 'gh' => '31' );
test( c => '123', d => '345', e => \%hash );

现在您的输出是:

12

要了解有关Perl中引用的更多信息,请查看[perlref] [2]和[perlreftut] [3]。您还可以在Perlmaven上查看这些教程:

这也是我更喜欢一直使用->解除引用运算符的原因之一,因此$hs{e}{game}变为$hs{e}->{game},尽管没有必要这样做。 Perl会知道你的意思。但是对于->,更明显的是有一个参考。 功能

另请注意,哈希不会进行插值,因此"%hash"不会像$,那样使用"@array"进行展开。这可能是因为哈希没有排序。或者因为你不能做printf "%s\n"。 功能