下面是一些简单的Perl来计算数组中出现值的次数.这没有任何警告.
use warnings; use strict; my @data = qw(1 1 2 3 4 5 5 5 9); my %histogram; foreach (@data) { $histogram{$_}++; }
当循环体变为
$histogram{$_} = $histogram{$_} + 1;
Perl警告"另外使用未初始化的值".
引擎盖下发生了什么?当作为操作符提供给++运算符并且使用+运算符未初始化时,为什么值被初始化?
+运算符计算左侧的表单和右侧的表单,然后返回两者的总和.哈希调用评估没有看到任何特殊上下文.
++运算符内置了一些特殊的魔法.从perlop联机帮助页引用,关于++运算符:
"undef"始终被视为数字,特别是在递增之前更改为0(因此undef值的后递增将返回0而不是"undef").
编辑:为了详细说明差异,++改变了值,而+只是将其参数作为输入.当+看到未定义的值时,通常会出现问题,但对于++,您的哈希操作示例非常典型 - 用户希望将undef视为0,而不是每次都检查和初始化.所以似乎以这种方式处理这些运算符是有意义的.
并不是Perl必须初始化值,而是它并不总是警告它们.不要试图考虑这个规则,因为你总是会发现异常,只要你认为它已经弄明白,下一个版本的Perl就会改变你的警告.
在这种情况下,正如Harleqin所说,自动增量运算符有一个特例.
某些操作符故意省略"未初始化"警告以方便您使用,因为它们通常用于左侧或唯一操作数的0或""默认值有意义的情况.
它们是:++和 - (pre或post),+ =, - =,.=,| =,^ =,&& =,|| =.
请注意,其中一些在绑定变量上使用时会错误地发出警告:请参阅http://perl5.git.perl.org/perl.git/blob/HEAD:/t/op/assignwarn.t中标记为TODO的测试..