Perl 无法正确合并哈希
我目前有以下几点Perl 无法正确合并哈希,perl,perl-data-structures,Perl,Perl Data Structures,我目前有以下几点 # $dog, $cat, $rat are all hash refs my %rethash = ('success' => 'Your Cool'); my %ref ={ 'dog' => $dog, 'cat' => $cat, 'mouse' => $rat, 'chicken' => '' };
# $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的引用,这一点在阅读您的回复后很明显。罗伯所说的是正确的。我将对此进行解释,并添加更多内容 您的变量名
%ref
以及您正在使用{}
这一事实意味着您需要在此处引用
让我们看看%ref
中的值。考虑这个例子。
use strict; use warnings;
use Data::Printer;
my %foo = { key => 'value' };
p %foo;
这将抛出一个警告引用,在我的Perl 5.20.2上预期的偶数大小的列表中找到。输出将是:
{
HASH(0x7e33c0) undef
}
它是一个散列,hashref作为键,unde
作为值<代码>散列(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
我不知道你想做什么,所以我真的不能帮你。我建议你读一些东西
- 有助于了解参考资料的工作原理
- 如果您想进行面向对象编程,请查看
- 去买一本书来学习更多关于基本Perl的知识也可能很有用。Randal L.Schwartz学习Perl和Curtis Poe开始学习Perl都非常有帮助
my $perlobj = ( \%ref, \%rethash ); # same as $perlobj = \%rethash
相反,您希望引用散列的合并
my $perlobj = { %ref, %rethash };
当创建
%ref
时,您正在使用{}
当您应该使用()
时,您还需要我的%perlobj=(%ref,%rethash)
您可能的副本广泛地混合了()
参数和{}
以及散列和散列引用。您发现了一个罕见的,
实例,它是序列运算符而不是列表构造函数。@PatrickJ.S。你能详细介绍一下顺序运算符吗?我在perldoc中找不到。感谢您将其分解,我真的很感激,我正在检查一些旧代码并向模块添加警告,发现了此错误。