1 perl hash scalar sigils variable-assignment
在查看一些Perl代码时,我遇到了将chr的输出直接赋值给hash:
local %str = chr(shift);
Run Code Online (Sandbox Code Playgroud)
感到困惑的是代码工作正常,这让我意识到以下几点:
perl -le 'my $jurso = 23; print $jurso;'
23
perl -le 'my %jurso = 23; print %jurso;'
23
perl -le 'my @jurso = 23; print @jurso;'
23
Run Code Online (Sandbox Code Playgroud)
我期望将标量直接分配给散列或数组以导致错误.有人可以解释为什么jurso变量表现得像标量而不管使用的sigil?
谢谢.
两个词:背景问题.如果您打开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
Run Code Online (Sandbox Code Playgroud)
换句话说,代码的第一个语句从单项列表创建哈希.这不是一个好兆头(因为哈希在源列表中通常应该有偶数个元素),因此是第一个警告.仍然,创建一个哈希:它有一个元素,用一个键寻址23,并且该元素的值是undef.
第二个语句attemtps打印这个哈希,它首先回显一个键(23),然后是它的值.这是undef,你还记得,因此第二次警告.尽管如此,该值被打印出来-为空字符串.)
使用数组,您甚至不会收到警告:
> perl -wle 'my @jurso = 23; print @jurso;'
23
Run Code Online (Sandbox Code Playgroud)
...因为第一个语句@jurso使用单个项填充数组,第二个语句只打印此数组.同样,背景也很重要.