为什么我的散列变平了?
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))
)。
我正在通过对子例程的引用来传递引用数组。当我尝试在子例程中引用它时,它会给出一个扁平化的散列。我怎样才能解决这个问题?我不想有一个平面散列,我无法确定这样做的原因。
我确定我在某处犯了错误但无法发现它。任何 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))
)。