启用警告后,如果在表达式中使用Use of uninitialized value $foo
并且尚未为其分配值,则perl通常会打印$foo
,但在某些情况下它可以正常,并且变量被视为,0
或''
没有警告。
在没有警告的情况下可以使用未初始化/未定义的变量的情况是什么?
答案 0 :(得分:18)
答案 1 :(得分:2)
到目前为止,我发现的案例是:
if $foo
或$foo || $bar
++
或--
+=
,-=
或.=
还有其他人吗?
答案 2 :(得分:2)
始终修复警告甚至烦人的烦恼。
可以关闭未定义的警告。您可以通过为操作创建新范围来实现此目的。有关详细信息,请参阅perldoc perllexwarn
。此方法适用于所有版本的perl。
{
no warnings 'uninitialized';
my $foo = "foo" + undef = "bar";
}
对于很多二元运算符,您可以使用新的Perl 5.10内容~~
和//
;有关详细信息,请参阅perldoc perlop
。
use warnings;
my $foo = undef;
my $bar = $foo // ''; ## same as $bar = defined $foo ? $foo : ''
也是//=
变体,如果变量未定义,则设置变量:
$foo //= '';
智能匹配(~~
)运算符非常酷,并且允许进行智能比较,这在perldoc perlsyn
中是非常好的检查:
use warnings;
my $foo = "string";
say $foo eq undef; # triggers warnings
say $foo ~~ undef; # no undef warnings
答案 3 :(得分:0)
真正的答案应该是:你为什么要打开警告?对于变量来说,undef是一个非常好的值(因为任何使用过数据库的人都可以告诉你),区分真实(发生的事情),虚假(没有发生)和undef(发生错误)通常是有意义的。
而不是说
use strict;
use warnings;
说
use common::sense;
你将获得警告的所有好处,但是关闭了未定义变量等令人讨厌的问题。
common :: sense可从CPAN获得。