Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 无法正确合并哈希_Perl_Perl Data Structures - Fatal编程技术网

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中找不到。感谢您将其分解,我真的很感激,我正在检查一些旧代码并向模块添加警告,发现了此错误。