什么时候可以在perl中使用未定义的变量并启用警告?

时间:2010-01-30 02:25:21

标签: perl warnings undefined

启用警告后,如果在表达式中使用Use of uninitialized value $foo并且尚未为其分配值,则perl通常会打印$foo,但在某些情况下它可以正常,并且变量被视为0''没有警告。

在没有警告的情况下可以使用未初始化/未定义的变量的情况是什么?

4 个答案:

答案 0 :(得分:18)

答案 1 :(得分:2)

到目前为止,我发现的案例是:

  • autovivification(gbacon's answer
  • 布尔上下文,如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获得。