如何在Perl中的不同包之间共享全局值?

时间:2010-01-21 13:43:44

标签: perl global-variables

是否有一种标准方法来编码模块以保存全局应用程序参数以包含在每个其他包中?例如:use Config;

一个只包含our个变量的简单包?那些只读变量怎么样?

2 个答案:

答案 0 :(得分:8)

已经有standard Config module,因此请选择其他名称。

假设您MyConfig.pm包含以下内容:

package MyConfig;

our $Foo = "bar";

our %Baz = (quux => "potrzebie");

1;

然后其他模块可能会在

中使用它
#! /usr/bin/perl

use warnings;
use strict;

use MyConfig;

print "Foo = $MyConfig::Foo\n";

print $MyConfig::Baz{quux}, "\n";

如果您不想完全限定名称,请改用标准Exporter模块。

MyConfig.pm添加三行:

package MyConfig;

require Exporter;
our @ISA = qw/ Exporter /;
our @EXPORT = qw/ $Foo %Baz /;

our $Foo = "bar";

our %Baz = (quux => "potrzebie");

1;

现在不再需要完整的包名称:

#! /usr/bin/perl

use warnings;
use strict;

use MyConfig;

print "Foo = $Foo\n";

print $Baz{quux}, "\n";

您可以使用

MyConfig.pm添加只读标量
our $READONLY;
*READONLY = \42;

perlmod中记录了这一点。

将其添加到@MyConfig::EXPORT后,您可以尝试

$READONLY = 3;

在另一个模块中,但你会得到

Modification of a read-only value attempted at ./program line 12.

作为替代方法,您可以使用constant模块在​​MyConfig.pm常量中声明,然后导出它们。

答案 1 :(得分:3)

不要使用全局变量进行配置,也不要将配置作为代码进行配置。我在Mastering Perl中有一整章关于此事。

而是创建一个任何其他包可用于访问配置数据的配置类。从长远来看,为你可能想要改变的东西提供一个接口要比通过分散你必须支持你生命中的变量名称来处理你自己锁定的那些东西要容易得多。

配置界面还可以通过组合实际配置数据的正确位来为组合问题撰写新答案。你隐藏了一个方法背后的所有内容,而更高级别的方法不必看它是如何实现的。例如,

 print "Hello!" unless $config->be_silent;

由于上级代码不需要了解的多种原因,可以触发be_silent答案。它可以来自用户交换机,程序检测到它不是交互式的,等等。它也可以通过调试开关等选项进行翻转,这些选项会覆盖所有其他首选项。无论你决定什么,该代码行都不会改变,因为该语句只关心答案,而不是你如何得到答案。