我面临以下问题: 我正在研究一个由许多模块和脚本组成的perl项目。该项目必须在两台不同的机器上运行。为perl中的许多脚本和模块定义常量
在整个项目中我调用外部程序,但路径在两台机器上都不同,所以我想为全部文件全局定义它们,然后在切换机器时仅更改此定义。
因为我对perl相当陌生,所以我问你一个通用的方法来完成这个任务。 我应该使用“使用定义”还是全局变量或其他?
在此先感谢!
我面临以下问题: 我正在研究一个由许多模块和脚本组成的perl项目。该项目必须在两台不同的机器上运行。为perl中的许多脚本和模块定义常量
在整个项目中我调用外部程序,但路径在两台机器上都不同,所以我想为全部文件全局定义它们,然后在切换机器时仅更改此定义。
因为我对perl相当陌生,所以我问你一个通用的方法来完成这个任务。 我应该使用“使用定义”还是全局变量或其他?
在此先感谢!
创建一个模块来保存配置信息。
在文件My/Config.pm
你的Perl库路径:
package My::Config;
use warnings;
use strict;
use Carp();
my %setup = (
one => {path => '/some/path'},
two => {path => '/other/path'},
);
my $config = $setup{ $ENV{MYCONFIG} }
or Carp::croak "environment variable MYCONFIG must be set to one of: "
.(join ' ' => keys %setup)."\n";
sub AUTOLOAD {
my ($key) = our $AUTOLOAD =~ /([^:]+)$/;
exists $$config{$key} or Carp::croak "no config for '$key'";
$$config{$key}
}
,然后在文件:
use My::Config;
my $path = My::Config->path;
当然你的机器的同时,环境变量MYCONFIG
设置的关键之一在%setup
。
谢谢你,我是这样做的,虽然我知道有多种方式做它....猜猜这是perl ...;) – Nick
如果我是你,我一定会尽全力避免全局变量 - 它们是编码风格较弱的标志(使用任何语言),并为您提供维护地狱。
相反,您可以创建并使用配置文件 - 每个机器都有一个配置文件。作为在Perl中,您有足够的自由选择,就可以使用CPAN模块:
和许多许多其他
这意味着我将不得不在每个使用这些变量的函数中加载这个文件吗? 这对我来说似乎有点沉重...... – Nick
您将不得不加载定义全局变量的包,或者至少在每个包中定义它们。你只能使用一个全局变量 - 一个持有你的配置对象并通过它获得你的静态值的全局变量。 –
而不是定义全局变量可能会或可能不起作用,为什么不使用子例程来查找可执行的可执行文件?
my $program = program_finder();
sub program_finder {
-x && return $_ for qw(/bin/perl /usr/bin/perl /usr/local/bin/perl);
die "Could not find a perl executable";
}
请原谅我这个可能很愚蠢的问题,但如果你知道你将需要局部变量的定义,为什么要使用全局变量呢? – TLP