严格与非严格:使用命名变量的哪个实例?

时间:2014-07-14 09:54:43

标签: perl function

我正在尝试找到问题并为以下Perl代码提出解决方案。

没有strictwarnings的文件有一个使用$variable而不声明它的函数。因此,该变量对文件是全局的,并且在该特定函数中对该变量的更改在其外部使用(因为它对于文件是全局的)。

由于最近的更新,此old_file现在requires自身的修改版本(new_file),其中定义了相同的功能。但是这个新版本有strictwarnings,因此定义了相同的变量,但这次是新函数中的'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;
}

1 个答案:

答案 0 :(得分:1)

在严格模式下,如果需要$ LISTEREPONSE成为包(文件)范围中的全局变量。

只需在文件开头(使用后)声明(我的$ LISTEREPONSE;)。

在第二种情况下,$ LISTEREPONSE在sub中声明,它是词法范围,仅在sub中可用。

my $LISTEREPONSE;
# ...
sub some_sub {
    $LISTEREPONSE .= $some_stuff;
}