为什么我的哈希变平了?

时间:2017-10-09 18:10:59

标签: perl hash reference dereference

我通过引用子例程传递一组引用。当我尝试在子例程中对它进行推理时,它会给出一个扁平的哈希值。我怎样才能解决这个问题?我不想要平坦的哈希,我无法确定原因。

我确信我在某个地方犯了一个错误但却无法发现它。任何意见/建议都是非常受欢迎的!期待听到这个美妙的社区!提前谢谢。

更新了问题陈述: 基本上我希望通过引用子例程来传递哈希。我的问题是,当我在子程序中用标量变量接受它,然后我尝试用%符号去引用它时,我仍然得到一个平面哈希。

更新: 有一个混乱。当我检查我的哈希值是否持平时 - 我只检查print Dumper %hash当我真的应该有实际上已使用print Dumper \%hash进行了检查。缺少这一信息导致了这个问题。

脚本:

#!/usr/bin/perl

use strict ;
use warnings ;
use Data::Dumper ;

my %h = (moe => "joe", toe => "poe") ;
my @a = (1,2,3,4) ;

my @refs = \(%h,@a) ;

sub sample()
{
  my $ref = shift ;
  my @refs = @{$ref} ;
  print "What I got in the sub! Seems OK!!\n" ;
  print Dumper @refs, "\n" ;

  my %h = %{$refs[0]} ;
  my @a = @{$refs[1]} ;

  print "I am not able to dereference this :(. Please help!! Hash is flat :(\n" ;
  print Dumper %h ;
  print Dumper @a ;
}

&sample(\@refs) ;

输出:

23:34:17[Host@User]$ ./test.pl 
What I got in the sub! Seems OK!!
$VAR1 = {
          'moe' => 'joe',
          'toe' => 'poe'
        };
$VAR2 = [
          1,
          2,
          3,
          4
        ];
$VAR3 = '
';
I am not able to dereference this :(. Please help!! Hash is flat :(
$VAR1 = 'moe';
$VAR2 = 'joe';
$VAR3 = 'toe';
$VAR4 = 'poe';
$VAR1 = 1;
$VAR2 = 2;
$VAR3 = 3;
$VAR4 = 4;

1 个答案:

答案 0 :(得分:4)

没有什么可以解决的。你有你想要的。您在%h中有一个哈希,在@a中有一个数组。

但是Data::Dumper获取了一个参数列表,它将每个参数视为要转储的单独变量。因此,当您将散列或数组传递给Dumper()时,它们将展开到列表中,您将它们显示为单独的变量。

如果要使用Dumper()查看数组或散列的结构,则应该传入对数据结构的引用。

print Dumper \%h;
print Dumper \@a;

当然,这实际上是您第一次拨打Dumper()时所做的事情。

print Dumper @refs;

我还应该指出你的代码中有一些错误(幸运的是?)相互抵消了。您使用空原型(sample)定义子例程sample() { ... },这意味着如果您传递任何参数,将会收到致命错误。但是当你调用子程序时,你使用&&sample(@refs)),其中一个效果是关闭原型检查 - 所以即使你将参数传递给子程序也可以。

最好完全省略原型(sub sample { ... })并调用没有&号(sample(@refs)))的子程序。