2011-10-08 9 views
1

私は以下の問題に直面しています: 私はいくつかのモジュールとスクリプトからなるperlプロジェクトを進めています。プロジェクトは2つの異なるマシンで実行する必要があります。perlのいくつかのスクリプトとモジュールの定数を定義する

私は外部プログラムを呼び出していますが、両方のマシンでパスが異なるので、すべてのファイルに対してグローバルに一度定義してから、マシンを切り替えるときにのみこの定義を変更したいと思います。

私はかなり新しいですが、これを達成するための一般的な方法は何かをお聞きします。 "use define"やグローバル変数などを使うべきですか?

ありがとうございます!

+0

これはおそらくばかげた質問ですが、変数にローカル定義が必要な場合は、なぜグローバルを使用するのですか? – TLP

答えて

0

設定情報を保持するモジュールを作成します。あなたのファイルで

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

そして:あなたのperlのライブラリパス内のファイルMy/Config.pm

あなたのマシン上

use My::Config; 

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

そしてもちろん、キーの一つに環境変数MYCONFIGを設定%setup

+0

ありがとう、私はこれのようにしましたが、私はそれを行う複数の方法があると知っています....それはperlだと思います...;) – Nick

1

私があなただったら、グローバル変数を避けるために最善を尽くします。彼らは弱いコーディングスタイル(あらゆる言語で)のサインであり、メンテナンスの地獄を提供します。

代わりに、構成ファイルを作成して使用することができます。これは、各マシンに1つずつです。

+0

これは、これらの変数を使用するすべての関数でこのファイルをロードする必要があることを意味します。 それは私にとって少し重いようです... – Nick

+0

とにかくグローバルバールを定義するパッケージをロードするか、少なくともすべてのパッケージでそれらを定義する必要があります。 1つのグローバル変数、つまり、設定オブジェクトを保持し、それを介して静的な値を取得するグローバル変数のみを使用できます。 –

1

よりもむしろ定義:Perlの上にある、あなたはCPANモジュールを使用する準備ができて、自由のためのオプションをたくさん持っています実行可能な実行可能ファイルを見つけるためにサブルーチンを使わないのはなぜですか?

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"; 
} 
関連する問題