无法正确合并哈希
Unable to properly merge hashes
我目前有以下
# $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 的引用,这在阅读您的回复后显而易见。
RobEarl 说的是正确的。我会对此进行解释并添加更多内容。
您的变量名称 %ref
以及您正在使用 {}
的事实有点暗示您需要此处的参考。
让我们看看我们在%ref
中会有什么价值。考虑这个例子。
use strict; use warnings;
use Data::Printer;
my %foo = { key => 'value' };
p %foo;
这将在我的 Perl 5.20.2 上引发警告在预期大小为偶数的列表中找到参考。输出将是:
{
HASH(0x7e33c0) undef
}
它是一个以 hashref 为键、undef
为值的散列。 HASH(0x07e33c0)
是在不取消引用的情况下查看哈希引用时得到的结果。 ({}
在那里是因为 Data::Printer 将哈希转换为哈希引用)。
回到你的代码,正确的引用标记是 $
。它是什么类型的参考并不重要。引用始终是标量(指向内存中存储 hash/array/something 的位置的指针)。
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
.
我不确定你想做什么,所以我无法真正帮助你。我建议您阅读一些内容。
- perlreftut 有助于了解引用的工作原理
- 如果您想进行面向对象编程,请查看Moose
- 去买一本书来进一步了解基本的 Perl 可能也很有用。 Randal L. Schwartz 的 Learning Perl 和 Curtis Poe 的 Beginning Perl 都非常适合
您正在获取哈希引用列表并将它们分配给标量
my $perlobj = ( \%ref, \%rethash ); # same as $perlobj = \%rethash
相反,您想引用哈希的合并
my $perlobj = { %ref, %rethash };
我目前有以下
# $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 的引用,这在阅读您的回复后显而易见。
RobEarl 说的是正确的。我会对此进行解释并添加更多内容。
您的变量名称 %ref
以及您正在使用 {}
的事实有点暗示您需要此处的参考。
让我们看看我们在%ref
中会有什么价值。考虑这个例子。
use strict; use warnings;
use Data::Printer;
my %foo = { key => 'value' };
p %foo;
这将在我的 Perl 5.20.2 上引发警告在预期大小为偶数的列表中找到参考。输出将是:
{
HASH(0x7e33c0) undef
}
它是一个以 hashref 为键、undef
为值的散列。 HASH(0x07e33c0)
是在不取消引用的情况下查看哈希引用时得到的结果。 ({}
在那里是因为 Data::Printer 将哈希转换为哈希引用)。
回到你的代码,正确的引用标记是 $
。它是什么类型的参考并不重要。引用始终是标量(指向内存中存储 hash/array/something 的位置的指针)。
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
.
我不确定你想做什么,所以我无法真正帮助你。我建议您阅读一些内容。
- perlreftut 有助于了解引用的工作原理
- 如果您想进行面向对象编程,请查看Moose
- 去买一本书来进一步了解基本的 Perl 可能也很有用。 Randal L. Schwartz 的 Learning Perl 和 Curtis Poe 的 Beginning Perl 都非常适合
您正在获取哈希引用列表并将它们分配给标量
my $perlobj = ( \%ref, \%rethash ); # same as $perlobj = \%rethash
相反,您想引用哈希的合并
my $perlobj = { %ref, %rethash };