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
数组,第二个语句只打印这个数组。同样,上下文很重要。
在查看一些 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
数组,第二个语句只打印这个数组。同样,上下文很重要。