为什么我的散列变平了?

Why is my hash getting flattened?

我正在通过对子例程的引用来传递引用数组。当我尝试在子例程中引用它时,它会给出一个扁平化的散列。我怎样才能解决这个问题?我不想有一个平面散列,我无法确定这样做的原因。

我确定我在某处犯了错误但无法发现它。任何 comments/suggestions 都完全欢迎!期待听到这个美妙社区的消息!提前致谢。

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

更新: 有一个 confusion.As 我正在检查我的哈希是否平坦 - 我只检查了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;

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

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

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

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

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

print Dumper @refs;

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

最好完全省略原型 (sub sample { ... }) 并调用不带 & 符号的子例程 (sample(@refs)))。