开发者

Defining constants for a number of scripts and modules in perl

开发者 https://www.devze.com 2023-04-11 10:23 出处:网络
I am facing the followin开发者_开发百科g problem: I am working on a perl project consisting of a number of modules and scripts. The project must run on two different machines.

I am facing the followin开发者_开发百科g problem: I am working on a perl project consisting of a number of modules and scripts. The project must run on two different machines.

Throughout the project i call external programs, but the paths are different on both machines, so I would like to define them once globally for all files and then only change this definition when i switch machines.

Since I am fairly new to perl I ask you what would be a common way to accomplish this. Should I use "use define" or global variables or something else?

Thanks in advance!


If I were you, I'd definitely do my best to avoid global variables - they are a sign of weak coding style (in any language) and offer you a maintenance hell.

Instead, you could create and use configuration files - one for each of your machines. Being on Perl, you have plenty of options for free, ready to use CPAN modules:

  • Config::Auto
  • Config::JSON
  • Config::YAML

And many many other


Rather than defining globals which may or may not work, why not use a subroutine to find a working executable?

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


Create a module to hold your configuration information.

In file My/Config.pm in your perl library path:

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

And then in your files:

use My::Config;

my $path = My::Config->path;

And of course on your machines, set the environment variable MYCONFIG to one of the keys in %setup.

0

精彩评论

暂无评论...
验证码 换一张
取 消