我正在尝试找到问题并为以下Perl代码提出解决方案。
没有strict
或warnings
的文件有一个使用$variable
而不声明它的函数。因此,该变量对文件是全局的,并且在该特定函数中对该变量的更改在其外部使用(因为它对于文件是全局的)。
由于最近的更新,此old_file
现在requires
自身的修改版本(new_file
),其中定义了相同的功能。但是这个新版本有strict
和warnings
,因此定义了相同的变量,但这次是新函数中的'my',最后返回。
棘手的是old_file
中的代码没有改变,因此它仍然希望将变量更改为自己的全局变量。
由于我不太了解Perl能够确定使用该函数的哪个版本(并且由于IT限制我无法测试它)我需要对行为进行解释,可能是链接关于该主题的一篇好文章。
代码:(我认为问题出在函数LISTEREPONSE
的变量start_handler
中。)
old_file:
use XML::Parser;
my $parser = new XML::Parser( ErrorContext => 2 );
$parser->setHandlers(
Start => \&start_handler,
End => \&end_handler,
Char => \&char_handler
);
$parser->parse(<$remote>);
close $remote;
...
sub start_handler {
my $expat = shift;
my $element = shift;
print;
while (@_) {
my $att = shift;
my $val = shift;
$LISTEREPONSE .= "$att=$val&";
}
}
NEW_FILE:
sub start_handler {
my $expat = shift;
my $element = shift;
print;
my $LISTEREPONSE;
while (@_) {
my $att = shift;
my $val = shift;
$LISTEREPONSE .= "$att=$val&";
}
return $LISTEREPONSE;
}
答案 0 :(得分:1)
在严格模式下,如果需要$ LISTEREPONSE成为包(文件)范围中的全局变量。
只需在文件开头(使用后)声明(我的$ LISTEREPONSE;)。
在第二种情况下,$ LISTEREPONSE在sub中声明,它是词法范围,仅在sub中可用。
my $LISTEREPONSE;
# ...
sub some_sub {
$LISTEREPONSE .= $some_stuff;
}