我通过引用子例程传递一组引用。当我尝试在子例程中对它进行推理时,它会给出一个扁平的哈希值。我怎样才能解决这个问题?我不想要平坦的哈希,我无法确定原因。
我确信我在某个地方犯了一个错误但却无法发现它。任何意见/建议都是非常受欢迎的!期待听到这个美妙的社区!提前谢谢。
更新了问题陈述: 基本上我希望通过引用子例程来传递哈希。我的问题是,当我在子程序中用标量变量接受它,然后我尝试用%符号去引用它时,我仍然得到一个平面哈希。
更新: 有一个混乱。当我检查我的哈希值是否持平时 - 我只检查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;
答案 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))
)的子程序。