1

在查看一些 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 变量的行为就像一个标量,而不管使用的符号是什么?

谢谢。

4

1 回答 1

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

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

第二条语句尝试打印此哈希,它首先回显一个键 (23),然后是它的值。undef正如你所记得的,它是第二个警告。尽管如此,这个值还是被打印出来 - 作为一个空字符串。)

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

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

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

于 2015-01-01T19:19:43.027 回答