只是问,因为我找不到我正在寻找的答案...... 这些线之间有什么区别,我假设没有区别。
我只是不确定$ stash-> {hashdata}是否自动成为参考。
my %data = { thing => 1, otherthing => 2 };
$stash->{hashdata} = \%data;
$stash->{hashdata} = { thing => 1, otherthing => 2 };
答案 0 :(得分:3)
{ ... }
是哈希引用的语法(类似地,[ ... ]
用于数组引用)。
当您将某些内容分配给哈希时,它将被解释为交替键/值的列表。如果列表中包含奇数个元素(例如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)"
的内容:
my %data = ('HASH(0xdeadbeef)' => undef);
这绝不是你想要的。
相当于
$stash->{hashdata} = { thing => 1, otherthing => 2 };
带有命名哈希的看起来像:
my %data = ( thing => 1, otherthing => 2 );
$stash->{hashdata} = \%data;
注意:第一行没有引用。我们将简单列表分配给%data
。
事实上,您可以将{ LIST }
视为语法糖:
do { my %tmp = LIST; \%tmp }
该块将%tmp
的范围限制在代码中的此位置; do
关键字将块转换为表达式,该表达式返回块中最后一个语句的结果。
答案 1 :(得分:0)
这是一个错误。
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}
是独立的。一方的变化不会发生在另一方。
是的,两者之间有很大的差异。