将变量导入 Perl 包

Importing variable into Perl package

我正在编写一个基本程序,其核心逻辑分为几个项目特定的模块以保持整洁(在程序逻辑中按目的组织子例程)。

突然无法在其中一个模块中公开 main 包中的选项,并且使用 our 语句似乎没有任何效果。

为简洁起见,我将复制并粘贴我编写的一个独立测试用例来检查此行为:

main.pl

#!/usr/bin/perl
use warnings;
use strict;
use File::Basename;

# The variable to be read by the module.
our $verbose = 1;

# Load Output.pm from directory
use lib dirname "[=10=]";
use Output;

write_message "Hello, world\n";

Output.pm

package Output;
use warnings;
use strict;
use parent "Exporter";
our @EXPORT = qw(write_message);

# Should be imported?
our $verbose;

sub write_message {
    print $_[0] unless !$verbose;
}

1;

预期结果: "Hello, world"
实际结果:死寂

很可能我想要实现的目标在 Perl 中甚至是不可能的,因为这不是模块的预期用途(而且我明白为什么会这样)。

我对 Perl 还是很陌生,有些事情我正在努力思考。我见过有人建议使用 our 声明符来跨包公开变量,但我不明白为什么这不起作用。

PS: 如果有人知道在模块之间拆分应用程序特定于程序的逻辑的更好方法,我也将不胜感激。 :) 但首先,我更愿意了解为什么 our-ing 变量不起作用。

our在当前包中声明了一个包变量。 main.pl中的那个指的是$main::verbose; Output.pm中的那个指的是$Output::verbose.

您可以使用全名 $main::verbose 从任何地方访问变量,但您不能真正 "export" 因为导出是指使符号可供模块的用户访问。你正试图做相反的事情。

our 语句只创建一个包变量(而 my 创建一个词法变量)。与导出无关

最好的选择可能是在 Output 包中声明变量并在其他地方作为 $Output::verbose 访问它。像这样

main.pl

#!/usr/bin/perl

use strict;
use warnings;

use File::Basename;
use lib dirname [=10=];
use Output;

$Output::verbose = 1;

write_message "Hello, world\n";

Output.pm

package Output;

use strict;
use warnings;

use Exporter 5.57 'import';
our @EXPORT = qw/ write_message /;

our $verbose;

sub write_message {
    print $_[0] if $verbose;
}

1;

请注意,我还从 [=16=] 周围删除了不正确的引号,并且自从 Exporter 的 5.57 版本以来,import 它是 import 子例程而不是子类化它