0

如果我有这样的事情:

%hash = {foo => 'bar', foo1=>'bar1',};

或者

%hash = (foo => 'bar', foo1=>'bar1',);

或者

$hash = {foo => 'bar', foo1=>'bar1',};

或者

$hash = (foo => 'bar', foo1=>'bar1',);

上述代码有何不同?以及如何访问他们的组件?

4

3 回答 3

9

(...)排序优先级,同时创建{...}一个哈希引用

%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"同样的事情也是如此。

于 2013-06-18T09:52:29.160 回答
3

你要

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';
于 2013-06-18T15:58:11.727 回答
3
  1. 将哈希引用分配给哈希。这没有意义。
  2. 将列表分配给哈希。这就是您通常处理哈希的方式。
  3. 将散列引用分配给标量。这就是您通常处理哈希引用的方式。
  4. 将列表分配给标量。您最终将获得存储的最后一个值。

要评估散列 (2) 中的标量值:

$hash{'foo'}

要访问 hashref (3) 中的标量值:

$hash->{'foo'}

有关参考perldoc perlref的更多信息,请参阅

于 2013-06-18T09:51:40.390 回答