Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Perl中导出变量是一种好的做法吗?_Perl_Variables_Export - Fatal编程技术网

在Perl中导出变量是一种好的做法吗?

在Perl中导出变量是一种好的做法吗?,perl,variables,export,Perl,Variables,Export,我发现,通过使用Perl的use机制,可以非常方便地传递配置和其他数据,这些数据只需读取或计算一次,然后在整个程序中多次使用。我通过将散列导出到调用方的名称空间来实现这一点。例如: package Myconfiguration; my %config; sub import { my $callpkg = caller(0); my $expsym = $_[1]; configure() unless %config; *{"$callpkg\::$e

我发现,通过使用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 ...
}

然而,我不确定这是否是一种最佳实践。添加一个返回带有数据的散列引用的方法是否更好?还有别的吗

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


为此,我通常使用简单对象(可选单例)和单个方法,如
get_property()

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

package MyConfiguration;
require Exporter;

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

our %Config;
然后,在脚本中:

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


如果您只想读取
%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;
 }

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

这个特定示例是配置的一个示例,但不需要。也就是说,我可能想更改元素。你可以在一个单例中更改值。这是我头脑中的猴子试图告诉我的,但我无法摆脱(尽管我更喜欢“使用导出器qw(导入)”;:)。我并不认为这是一个全局变量,实际上这正是我在这里要做的。这里唯一的缺点是方法调用开销,但这不太重要,特别是考虑到维护和调试。另外,如果有一个与本地相关的名称(这不仅仅是配置问题),那么就可以很容易地为sub加上别名。我同意setter和getter是一种方法。他们给你更多的控制。例如,您可以对值集进行检查,并对值获取进行计算。但导出器文档明确指出:“导出变量不是一个好主意。它们可能会在引擎盖下发生变化,引发可怕的远距离影响,这太难跟踪和修复。相信我:它们不值得。”真的,在这种情况下,仅仅因为你可以,并不意味着这是个好主意。
 sub set_value
 {
      my ($key, $value) = @_;
      $config{$key} = $value;
 }