当前位置:  开发笔记 > 编程语言 > 正文

Perl何时自动初始化变量?

如何解决《Perl何时自动初始化变量?》经验,为你挑选了3个好方法。

下面是一些简单的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警告"另外使用未初始化的值".

引擎盖下发生了什么?当作为操作符提供给++运算符并且使用+运算符未初始化时,为什么值被初始化?



1> Svante..:

+运算符计算左侧的表单和右侧的表单,然后返回两者的总和.哈希调用评估没有看到任何特殊上下文.

++运算符内置了一些特殊的魔法.从perlop联机帮助页引用,关于++运算符:

"undef"始终被视为数字,特别是在递增之前更改为0(因此undef值的后递增将返回0而不是"undef").

编辑:为了详细说明差异,++改变了值,而+只是将其参数作为输入.当+看到未定义的值时,通常会出现问题,但对于++,您的哈希操作示例非常典型 - 用户希望将undef视为0,而不是每次都检查和初始化.所以似乎以这种方式处理这些运算符是有意义的.



2> brian d foy..:

并不是Perl必须初始化值,而是它并不总是警告它们.不要试图考虑这个规则,因为你总是会发现异常,只要你认为它已经弄明白,下一个版本的Perl就会改变你的警告.

在这种情况下,正如Harleqin所说,自动增量运算符有一个特例.



3> ysth..:

某些操作符故意省略"未初始化"警告以方便您使用,因为它们通常用于左侧或唯一操作数的0或""默认值有意义的情况.

它们是:++和 - (pre或post),+ =, - =,.=,| =,^ =,&& =,|| =.

请注意,其中一些在绑定变量上使用时会错误地发出警告:请参阅http://perl5.git.perl.org/perl.git/blob/HEAD:/t/op/assignwarn.t中标记为TODO的测试..

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有