2011-10-08 32 views
1

我面临以下问题: 我正在研究一个由许多模块和脚本组成的perl项目。该项目必须在两台不同的机器上运行。为perl中的许多脚本和模块定义常量

在整个项目中我调用外部程序,但路径在两台机器上都不同,所以我想为全部文件全局定义它们,然后在切换机器时仅更改此定义。

因为我对perl相当陌生,所以我问你一个通用的方法来完成这个任务。 我应该使用“使用定义”还是全局变量或其他?

在此先感谢!

+0

请原谅我这个可能很愚蠢的问题,但如果你知道你将需要局部变量的定义,为什么要使用全局变量呢? – TLP

回答

0

创建一个模块来保存配置信息。

在文件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

+0

谢谢你,我是这样做的,虽然我知道有多种方式做它....猜猜这是perl ...;) – Nick

1

如果我是你,我一定会尽全力避免全局变量 - 它们是编码风格较弱的标志(使用任何语言),并为您提供维护地狱。

相反,您可以创建并使用配置文件 - 每个机器都有一个配置文件。作为在Perl中,您有足够的自由选择,就可以使用CPAN模块:

和许多许多其他

+0

这意味着我将不得不在每个使用这些变量的函数中加载这个文件吗? 这对我来说似乎有点沉重...... – Nick

+0

您将不得不加载定义全局变量的包,或者至少在每个包中定义它们。你只能使用一个全局变量 - 一个持有你的配置对象并通过它获得你的静态值的全局变量。 –

1

而不是定义全局变量可能会或可能不起作用,为什么不使用子例程来查找可执行的可执行文件?

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"; 
}