gpt4 book ai didi

perl - 将变量导入 Perl 包

转载 作者:行者123 更新时间:2023-12-02 09:32:17 24 4
gpt4 key购买 nike

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

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

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

主要.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 "$0";
use Output;

write_message "Hello, world\n";

输出.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 声明符来跨包公开变量,但我不明白为什么这不起作用。

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

最佳答案

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

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

主.pl

#!/usr/bin/perl

use strict;
use warnings;

use File::Basename;
use lib dirname $0;
use Output;

$Output::verbose = 1;

write_message "Hello, world\n";

输出.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;

请注意,我还从 $0 中删除了不正确的引号,并且自从 Exporter 5.57 版本以来,它就可以(并且更可取)导入 它是 import 子例程而不是子类化它

关于perl - 将变量导入 Perl 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31762830/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com