【发布时间】:2018-03-21 00:34:44
【问题描述】:
我通过引用一个子例程来传递一个引用数组。当我尝试在子例程中尊重它时,它会给出一个扁平的哈希值。我怎样才能解决这个问题?我不想要一个平面哈希,我无法确定原因。
我确定我在某个地方犯了错误,但无法发现它。任何cmets /建议都完全欢迎!期待听到这个精彩社区的消息!提前致谢。
更新的问题陈述: 基本上我希望通过引用子例程来传递哈希。我的问题是,当我在带有标量变量的子例程中接受它,然后我尝试用 % 符号取消引用它时,我仍然得到一个平面哈希。
更新: 出现了混乱。当我检查我的哈希值是否平坦时,我只检查了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;
【问题讨论】:
-
您可能喜欢 Data::Printer。如果是检查数据结构,它会比用于机器消耗的 Data::Dumper 更容易使用。
-
你自己把事情弄得很复杂。您有大量的引用和取消引用,并且您滥用子例程原型并通过调用
&来击败它们。我只能想象这已被写成“查找所有错误”的家庭作业。这很好,但请在你的问题中这样说。 -
@simbabque:我一直不明白
Data::Printer的吸引力,你能解释一下吗?我一直更喜欢Data::Dump的输出而不是Data::Dumper的输出,但这只是因为它的默认输出更简洁。还有JSON和YAML的选项,我不明白为什么另一种无法解析的格式比其中任何一种都好。 -
@Borodin 我喜欢它,因为它对哈希键进行排序,简洁明了地显示所有内容,了解类内部结构、继承、列出方法,而且它是彩色的!我用 Data::Dumper 学习了“调试”并使用了很长时间。我只是觉得当我必须阅读它时,
p更好。也许这是一种偏好,我不确定。但是你提到的其他都是用于传输数据的。 DDP 是为您快速阅读而设计的。 -
@Borodin 只要我们不需要在它周围加上
<pre>,我对大多数人都很好。无论什么可用,都能完成工作。 :-)
标签: perl hash reference dereference