Perl:将标量直接分配给哈希

Perl: assign a scalar directly to a hash

在查看一些 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 变量的行为像一个标量,而不管使用的印记如何?

谢谢。

两个词:上下文很重要。如果你打开 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.

第二条语句尝试打印此散列,它首先回显一个键 (23),然后回显它的值。正如您所记得的那样,它是 undef,因此是第二个警告。不过,这个值 打印出来的——作为一个空字符串。 )

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

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

... 因为第一个语句用单个项目填充 @jurso 数组,第二个语句只打印这个数组。同样,上下文很重要。