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_Reference - Fatal编程技术网

使用箭头运算符将数组/哈希分配给数据结构。Perl

使用箭头运算符将数组/哈希分配给数据结构。Perl,perl,reference,Perl,Reference,只是问因为我找不到我想要的答案。。。 这两条线有什么区别,我假设没有区别 我只是不确定它$stash->{hashdata}是否会自动成为一个引用 my %data = { thing => 1, otherthing => 2 }; $stash->{hashdata} = \%data; $stash->{hashdata} = { thing => 1, otherthing => 2 }; {…}是哈希引用的语法(类似地,[…]用于数组引用) 将

只是问因为我找不到我想要的答案。。。 这两条线有什么区别,我假设没有区别

我只是不确定它$stash->{hashdata}是否会自动成为一个引用

my %data = { thing => 1, otherthing => 2 };
$stash->{hashdata} = \%data;


$stash->{hashdata} = { thing => 1, otherthing => 2 };

{…}
是哈希引用的语法(类似地,
[…]
用于数组引用)

将某些内容分配给哈希时,它将被解释为交替键/值的列表。如果列表中的元素数为奇数(如1),则会出现以下警告:

Odd number of elements in hash assignment at ...
。。。除非只有一个值作为引用,否则在这种情况下,您会得到:

Reference found where even-sized list expected at ...
在任何情况下,最后一个元素都被解释为具有相应值
undef
的键

因此,如果尝试将引用分配给哈希:

my %data = { ... };
将发出警告,代码的行为与您编写的代码类似:

my %data = ({ ... } => undef);
哈希键始终是字符串,因此引用被隐式字符串化,产生类似于
“Hash(0xdeadbeef)”

这永远不是你想要的


相当于

$stash->{hashdata} = { thing => 1, otherthing => 2 };
使用命名的哈希将如下所示:

my %data = ( thing => 1, otherthing => 2 );
$stash->{hashdata} = \%data;
注:第一行中没有参考。我们正在为
%数据
分配一个普通列表

事实上,您可以将
{LIST}
视为以下方面的语法糖:

do { my %tmp = LIST; \%tmp }
该块将
%tmp
的范围限制在代码中的该位置;
do
关键字将块转换为表达式,返回块中最后一条语句的结果。

这是一个错误

my %data = { thing => 1, otherthing => 2 };
应该是

my %data = ( thing => 1, otherthing => 2 );
这两者有什么区别

$stash->{hashdata} = \%data;
$stash->{hashdata} = { thing => 1, otherthing => 2 };
第一个表示对
%data
的任何更改也将发生在
$stash->{hashdata}
中,反之亦然,因为它引用了
%data

第二种意思是
%data
$stash->{hashdata}
是独立的。其中一个的变化不会发生在另一个


是的,这两者之间有很大的区别。

这个
。\u hashref
返回一个散列引用,而不是散列;您需要将其分配给标量,例如
$data
。然后,
$stash->{hashdata}=$data
$stash->{stashdata}=$sth->…
抱歉,输入错误的问题我只是想了解语言如何处理此场景,而不是语法问题。谢谢你!好的,你得到答案了。我的第一条评论同样适用于已更改的问题--
{…}
是一个散列引用(就像原始问题中返回的
fetch_hashref
一样),而不是散列--因此需要将其分配给标量,然后第一位与第二位相同。从您得到的详细答案中得到的另一个结果是:始终具有
使用警告(和
在程序顶部使用strict;
)。Re“我只是不确定它$stash->{hashdata}是否自动成为引用,
\%data
{}
都返回对哈希的引用,所以是的。
$stash->{hashdata} = \%data;
$stash->{hashdata} = { thing => 1, otherthing => 2 };