这个Perl表达式有什么问题?

时间:2011-12-08 05:22:38

标签: perl variables if-statement

以下是什么问题。我收到$attribute not defined错误。

if (my $attribute = $Data->{'is_new'} and $attribute eq 'Y') {
}

4 个答案:

答案 0 :(得分:10)

你太聪明了。就这样做:

my $attribute = $Data->{'is_new'};

if (defined $attribute && $attribute eq 'Y') { ... }

问题有两个:

  • if
  • 中有额外的) 表达式上下文中的
  • my绑定非常紧密; $attribute在包含它的条件语句的主体之前不在词法范围内,因此and的另一个分支无法访问它。您需要将其提升到包含的上下文,如我的示例所示。

答案 1 :(得分:10)

use strict;会发现问题。

$ perl -e'use strict; my $attribute = "..." and $attribute eq "Y";'
Global symbol "$attribute" requires explicit package name at -e line 1.
Execution of -e aborted due to compilation errors.

my声明仅对后续语句有影响,而不是声明所在的语句。 (同样适用于ourlocal声明。)这意味着您使用$attribute创建的my并且您指定的$attribute是与{{1}不同的变量你与Y比较。你想要

my $attribute = $Data->{'is_new'};
if ($attribute eq 'Y') { ... }

现在,如果$Data->{is_new}不存在或未定义,$attribute将是未定义的,将其与Y进行比较会发出警告。您可以按如下方式避免此警告:

my $attribute = $Data->{'is_new'};
if (defined($attribute) && $attribute eq 'Y') { ... }

或者:(5.10 +)

my $attribute = $Data->{'is_new'};
if (($attribute // '') eq 'Y') { ... }

答案 2 :(得分:1)

其他答案都很好。我只想补充一点,如果你想避免使用$attribute变量来混淆周围的范围:

if (($Data->{'is_new'} || '') eq 'Y') {
    # do stuff
}

这也适用于strictwarnings

答案 3 :(得分:0)

就像已经提到过的那样,你不能声明一个变量并同时使用它。就是那样子;您需要在使用新变量之前完成声明语句。

你可以做些什么,而且坦率地说,有点失去至于为什么还没有提到这个,是这样的:

if (my $attribute = $Data->{'is_new'} and $Data->{'is_new'} eq 'Y') 

$attribute尚未声明,但$Data->{'is_new'}

请注意:if语句的重点是三件事:

  • 初始化并为$attribute
  • 指定一个值
  • 检查此值是否未定义/空字符串/零
  • 检查此值是否为'Y'

$attribute的词法范围是if语句后续块的内部,不多也不少。