Perl:直接为散列分配标量

时间:2015-01-01 19:12:39

标签: perl hash variable-assignment scalar sigils

在查看一些Perl代码时,我遇到了将chr的输出直接赋值给哈希:

local %str = chr(shift);

感到困惑的是代码工作正常,这让我意识到以下几点:

perl -le 'my $jurso = 23; print $jurso;'
23

perl -le 'my %jurso = 23; print %jurso;'
23

perl -le 'my @jurso = 23; print @jurso;'
23

我希望将标量直接分配给散列或数组以导致错误。有人可以解释为什么jurso变量表现得像标量而不管使用的是什么?

感谢。

1 个答案:

答案 0 :(得分:5)

两个字:上下文重要。如果您打开warnings,则更容易理解这里发生了什么:

> perl -wle 'my %jurso = 23; print %jurso;'
Odd number of elements in hash assignment at -e line 1.
Use of uninitialized value $jurso{"23"} in print at -e line 1.
23

换句话说,代码的第一个语句从单项列表中创建一个哈希。这不是一个好兆头(因为哈希在源列表中通常应该有偶数个元素),因此是第一个警告。仍然会创建一个哈希:它有一个元素,用键23寻址,该元素的值为undef

第二个语句attemtps打印这个哈希,它首先回显一个键(23),然后是它的值。你记得它是undef,因此是第二个警告。仍然,此值 打印出来 - 作为空字符串。 )

使用数组,您甚至不会收到警告:

> perl -wle 'my @jurso = 23; print @jurso;'
23

...由于第一个语句用@jurso数组填充单个项目,第二个语句只打印此数组。同样,背景很重要。