在Perl中导出变量是一种好习惯吗?

时间:2010-04-07 15:30:29

标签: perl variables export

我发现传递配置和其他一次读取或计算的数据非常方便,但是在整个程序中使用Perl的use机制会多次使用。我是通过将哈希导出到调用者的命名空间来实现的。例如:

package Myconfiguration;

my %config;

sub import {
    my $callpkg = caller(0);
    my $expsym = $_[1];

    configure() unless %config;

    *{"$callpkg\::$expsym"} = \%config;
}

然后在其他模块中:

use MyConfiguration (loc_config_sym);

if ( $loc_config_sym{paramater} ) {
    # ... do stuff ...
}

但是,我不确定这是最佳做法。添加一个返回带有数据的散列引用的方法是否更好?别的什么?

4 个答案:

答案 0 :(得分:5)

如果您只想阅读%config的值,那么为什么不为您做一个常规操作呢?

 my %config;
 sub config_value
 {
      my ($value) = @_;
      return $config{$value};
 }

如果您愿意,可以默认导出:

package Mypackage;
require Exporter;
@EXPORT = qw/config_value/;

我不允许在许多不同的模块中访问散列的原因是我在心理上很难跟踪它所使用的所有地方。我宁愿做出上述类型的访问例程,这样,如果发生了一些错误,我可以在例程或其他东西中添加一个print语句,以找出访问该值的时间。我不知道这是否与“最佳实践”有关,或者仅仅因为我是愚蠢的,但全局变量造成的那种混乱让我感到害怕。

你没有理由不能设定例程:

 sub set_value
 {
      my ($key, $value) = @_;
      $config{$key} = $value;
 }

答案 1 :(得分:2)

我认为最好使用配置哈希的副本。这样,如果修改某些元素,这不会影响代码的其余部分。

我通常使用简单对象(可选择Singleton)来使用get_property()这样的单一方法。

答案 2 :(得分:2)

我建议永远不要导出变量。创建一个可以返回对私有变量的引用的类。然后,人们可以将它存储在一个变量中,并使用他们喜欢的名称,并且只有在他们决定要使用它时才会存储。

答案 3 :(得分:0)

通常,最好让用户决定是否导入符号。 Exporter让这很容易。编写自定义import方法让用户决定将导入符号命名为什么在极少数情况下很有用,但我不认为这是其中之一。

package MyConfiguration;
require Exporter;

our @ISA       = qw(Exporter);
our @EXPORT_OK = qw(Config);

our %Config;

然后,在你的剧本中:

use MyConfiguration;
print $MyConfiguration::Config{key};

use MyConfiguration qw(Config);
print $Config{key};