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