ing*_*eni 2 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' => '' };
my $perlobj = ( \%ref,\%rethash );
Run Code Online (Sandbox Code Playgroud)
当$ perlobj被转储时,这就是结果
$VAR1 = {
'success' => 'Your Cool'
};
Run Code Online (Sandbox Code Playgroud)
但是,当启用警告时,我收到以下消息
Useless use of reference constructor in void context at ..
Run Code Online (Sandbox Code Playgroud)
我意识到使用{}分配%ref的方法存在严重错误,这段代码有什么问题?我似乎无法摆脱这个警告......
编辑:好的我想我发现了什么,
my $perlobj = ( \%ref,\%rethash );
Run Code Online (Sandbox Code Playgroud)
这不会合并但会导致$ perlobj成为%rethash的引用,这在阅读您的回复后很明显.
RobEarl所说的是正确的.我将对此进行解释并添加更多内容.
你的变量名%ref和你正在使用的事实{}暗示你想在这里引用.
让我们来看看我们将拥有什么样的价值%ref.考虑这个例子.
use strict; use warnings;
use Data::Printer;
my %foo = { key => 'value' };
p %foo;
Run Code Online (Sandbox Code Playgroud)
这将抛出一个警告参考文献中找到了我的Perl 5.20.2上预期的偶数大小的列表.输出将是:
{
HASH(0x7e33c0) undef
}
Run Code Online (Sandbox Code Playgroud)
它是一个散列,其中hashref作为键和undef值.HASH(0x07e33c0)是你在没有解除引用的情况下查看哈希引用时得到的结果.({}因为Data :: Printer将哈希值转换为hashref).
回到你的代码,参考的正确的sigil是$.它是什么样的参考并不重要.引用始终是一个标量(指向存储器中存储散列/数组/内容的位置的指针).
my $ref = {
dog => $dog,
cat => $cat,
mouse => $rat,
chicken => '', # maybe this should be undef?
};
Run Code Online (Sandbox Code Playgroud)
现在你已经有了用的值hashref $dog,$cat,$rat和一个空字符串.
现在你要分配一个名为的变量$perlobj,这意味着它是一个对象.相反,您将$使用列表分配标量变量(使其成为标量).如果你这样做,Perl只会为变量分配最右边的值.
my $foo = (1, 2, 3); # $foo will be 3 and there's a warning
Run Code Online (Sandbox Code Playgroud)
您正在分配两个参考的列表.第一个被忽略,只\$rethash被分配.这很方便,因为它$perlobj是一个标量,引用也是标量.所以现在$perlobj是参考%rethash.这就是你的Data :: Dumper输出的原因%rethash.
我不确定你想做什么,所以我无法真正帮助你.我建议你阅读一些内容.
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |