以下是什么问题。我收到$attribute not defined
错误。
if (my $attribute = $Data->{'is_new'} and $attribute eq 'Y') {
}
答案 0 :(得分:10)
你太聪明了。就这样做:
my $attribute = $Data->{'is_new'};
if (defined $attribute && $attribute eq 'Y') { ... }
问题有两个:
)
表达式上下文中的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
声明仅对后续语句有影响,而不是声明所在的语句。 (同样适用于our
和local
声明。)这意味着您使用$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
}
这也适用于strict
和warnings
。
答案 3 :(得分:0)
就像已经提到过的那样,你不能声明一个变量并同时使用它。就是那样子;您需要在使用新变量之前完成声明语句。
你可以做些什么,而且坦率地说,有点失去至于为什么还没有提到这个,是这样的:
if (my $attribute = $Data->{'is_new'} and $Data->{'is_new'} eq 'Y')
$attribute
尚未声明,但$Data->{'is_new'}
是。
请注意:if语句的重点是三件事:
$attribute
'Y'
$attribute
的词法范围是if语句后续块的内部,不多也不少。