Perl包变量没有使用我们的

时间:2015-11-11 19:03:17

标签: perl package scoping

是否可以在不使用我们的情况下设置包变量。

这是一个代码示例,可以更好地解释案例:

package A::B::C;

use strict;
use warnings;
use Exporter ();
our @ISA = qw/Exporter/;
our @EXPORT = ();
our @EXPORT_OK = qw/INFO/;
our %EXPORT_TAGS = (
    default => [qw/INFO/]
);
Exporter::export_ok_tags("default");

BEGIN {
    $C::verbose = 0;
}

sub INFO {
    my $msg = shift;

    if ($C::verbose) {
        print("$msg\n");
    }
}

从使用包A :: B :: C的脚本设置变量$ verbose不会更改包中$ verbose的值:

use A::B::C;

$A::B::C::verbose = 1;

我完全知道在包中使用'our'可以解决问题,但我更想知道发生了什么以及为什么不能从使用包A :: B的脚本设置变量$ verbose ::C。或者更好的是,在包子例程中仅使用(而不是正式声明)的包变量会发生什么变化;他们得到的范围是什么?

1 个答案:

答案 0 :(得分:3)

您需要引用正确的软件包名称:FROM projCorp pc LEFT JOIN projects p ON p.projId = pc.projId AND p.projId = '9' LEFT JOIN projStaff ps ON p.projId = ps.projId LEFT JOIN staff s ON ps.staffId = s.StaffId AND s.company = pc.company; 不在$verbose包中,而是在C中。所以以下工作按预期进行:

A::B::C