如果我有这样的事情:
%hash = {foo => 'bar', foo1=>'bar1',};
或者
%hash = (foo => 'bar', foo1=>'bar1',);
或者
$hash = {foo => 'bar', foo1=>'bar1',};
或者
$hash = (foo => 'bar', foo1=>'bar1',);
上述代码有何不同?以及如何访问他们的组件?
(...)
排序优先级,同时创建{...}
一个哈希引用。
%hash = {foo => 'bar', foo1=>'bar1',};
分配%hash
单个值。但是,散列被分配了一个偶数大小的键值对列表。您的代码将使用 hashref 的字符串化作为键 ( HASH(0x123ABC)
) 和undef
值。use warnings
当您将非偶数大小的列表分配给哈希变量时,请告诉您。
%hash = (foo => 'bar', foo1=>'bar1',);
是正确的。RHS 列表在列表上下文中进行评估,并分配给散列变量。您可以访问类似的条目$hash{foo}
。
$hash = {foo => 'bar', foo1=>'bar1',};
是正确的。散列引用分配给标量变量。您可以访问诸如$hash->{foo}
. 请注意取消引用箭头,这是消除 hashref 访问与哈希访问的歧义所必需的(您可以在同一范围内同时命名变量)%hash
。$hash
$hash = (foo => 'bar', foo1=>'bar1',);
在标量上下文中评估 RHS 上的列表,并将分配最后一个值。$hash = "bar1"
同样的事情也是如此。
你要
my %hash = ( key1 => 'value1', key2 => 'value2' ); # Hash
或者
my $hash = { key1 => 'value1', key2 => 'value2' }; # Reference to hash
当将列表分配给哈希时,它被视为键值对列表,因此初始化哈希的正确方法是
my %hash = ( key1 => 'value1', key2 => 'value2' );
{ ... }
类似于
do { my %anon = ( ... ); \%anon }
它创建一个匿名哈希并返回对它的引用。单个引用不是键值对列表,因此以下内容毫无意义:
my %hash = { ... }; # XXX
如果您确实想存储对哈希的引用,则可以将其存储在标量中。
my $hash = { ... }; # ok
那么下面是做什么的呢?
my $hash = ( a => 'b', c => 'd' );
出色地,
a => 'b', c => 'd'
只是一种花哨的写作方式
'a', 'b', 'c', 'd'
由于我们正在分配一个标量,因此赋值运算符的右侧是在标量上下文中评估的。标量上下文中的列表文字(例如'a', 'b', 'c', 'd'
)在其最后一项中进行评估,因此
my $hash = ( a => 'b', c => 'd' );
方法
my $hash = 'd';
要评估散列 (2) 中的标量值:
$hash{'foo'}
要访问 hashref (3) 中的标量值:
$hash->{'foo'}