我目前有以下
# $dog, $cat, $rat are all hash refs
my %rethash = ('success' => 'Your Cool');
my %ref ={ 'dog' => $dog, 'cat' => $cat, 'mouse' => $rat,
'chicken' => '' };
my $perlobj = ( \%ref,\%rethash );
当转储$ perlobj时,这是结果
$VAR1 = {
'success' => 'Your Cool'
};
但是,当启用警告时,我收到以下消息
Useless use of reference constructor in void context at ..
我意识到使用{}分配%ref的方法存在严重错误,这段代码有什么问题?我似乎无法摆脱这种警告......
编辑: 好吧我想我发现了什么,
my $perlobj = ( \%ref,\%rethash );
这不合并但会导致$ perlobj成为%rethash的引用,这在阅读你的回复后就很明显了。
答案 0 :(得分:5)
RobEarl所说的是正确的。我将对此进行解释并添加更多内容。
您的变量名称%ref
以及您使用{}
的事实意味着您需要此处的引用。
让我们来看看我们在%ref
中会有什么价值。考虑这个例子。
use strict; use warnings;
use Data::Printer;
my %foo = { key => 'value' };
p %foo;
这会在我的Perl 5.20.2上发出一个警告 Reference,其中包含预期的大小列表。输出将是:
{
HASH(0x7e33c0) undef
}
这是一个散列,其中hashref为键,undef
为值。 HASH(0x07e33c0)
是您在不解除引用的情况下查看哈希引用时获得的内容。 ({}
就在那里,因为Data :: Printer将哈希转换为hashref。)
回到你的代码,正确的参考信号是$
。它是什么样的参考并不重要。引用始终是一个标量(指向存储器中存储散列/数组/内容的位置的指针)。
my $ref = {
dog => $dog,
cat => $cat,
mouse => $rat,
chicken => '', # maybe this should be undef?
};
现在您的hashref值为$dog
,$cat
,$rat
和空字符串。
现在你要分配一个名为$perlobj
的变量,这意味着它是一个对象。相反,您将使用列表分配标量变量($
使其成为标量)。如果你这样做,Perl只会为变量分配最右边的值。
my $foo = (1, 2, 3); # $foo will be 3 and there's a warning
您正在分配两个参考的列表。第一个被忽略,只有\$rethash
被分配。这很方便,因为$perlobj
是标量,引用也是标量。所以现在$perlobj
是%rethash
的引用。这就是你的Data :: Dumper输出看起来像%rethash
。
我不确定你想做什么,所以我无法真正帮助你。我建议你阅读一些内容。
答案 1 :(得分:2)
您正在获取哈希引用列表并将它们分配给标量
my $perlobj = ( \%ref, \%rethash ); # same as $perlobj = \%rethash
相反,您想要引用哈希合并
my $perlobj = { %ref, %rethash };