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

gvk*_*vkv 5 variables perl export

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

package Myconfiguration;

my %config;

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

    configure() unless %config;

    *{"$callpkg\::$expsym"} = \%config;
}
Run Code Online (Sandbox Code Playgroud)

然后在其他模块中:

use MyConfiguration (loc_config_sym);

if ( $loc_config_sym{paramater} ) {
    # ... do stuff ...
}
Run Code Online (Sandbox Code Playgroud)

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

小智 5

如果你只想读取它的值%config,为什么不为你做一个例行程序呢?

 my %config;
 sub config_value
 {
      my ($value) = @_;
      return $config{$value};
 }
Run Code Online (Sandbox Code Playgroud)

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

package Mypackage;
require Exporter;
@EXPORT = qw/config_value/;
Run Code Online (Sandbox Code Playgroud)

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

没有理由你也没有一套例程:

 sub set_value
 {
      my ($key, $value) = @_;
      $config{$key} = $value;
 }
Run Code Online (Sandbox Code Playgroud)