3

やあ、

私は、perl スクリプトの開発に関して、多少の難問を経験しています。標準 (基本) Perl インストールを使用して小さな Perl スクリプトを作成しました。私は次の設定をしています:

C:\MyScript\perl.pl
C:\MyScript\configuration\config.ini
C:\MyScript\output\output.txt

これは perl.pl ソースです:

$config      = '/configuration/config.ini';
$conf        = Config::IniFiles->new( -file => $config_file );
$output_dir  = conf->val('output', 'out_dir');
$output_file = "$output_dir/output.txt";

open (out, ">$output_file") || die ("It's not your day mate!");
print out "This is a test...";
close out;

これは config.ini の内容です。

[output]
output_dir = C:\MyScript\output

私が抱えている問題は、2 行目 ($conf) でその場所のファイルを開くのに問題があるように見えることです。このスクリプトを Windows と UNIX 環境の両方で (追加モジュールをインストールせずに) 使用するので、どうすればこれを回避できるのでしょうか? 私が望んでいたのは、config.ini ファイルを通じて完全に構成可能なスクリプトを作成することでした。ただし、構成は、次のように絶対パスを指定した場合にのみ機能します。

$config = 'C:\MyScript\configuration\config.ini';

しかし、これはいくつかの多様な環境に展開されるため、スクリプト ソースを変更することは問題外です。皆さんは何をお勧めしますか?そのようなシナリオにどのようにアプローチする必要がありますか?

どんな助けやアドバイスも大歓迎です。

MCさん、おつかれさまでした

4

2 に答える 2

3

問題は $config 割り当て行にあります -

$config      = '/configuration/config.ini';

これは、ルート ディレクトリから config.ini を検索します。先頭の「/」が原因で、パスが相対パスではなく絶対パスとして解釈されます。に変更してみてください

$config      = './configuration/config.ini';

これは、「MyScript」ディレクトリから perl スクリプトを実行した場合にのみ機能します。このような場合は FindBin モジュールを参照するか、$0 変数を操作して perl スクリプトのパスを取得できます。

于 2009-04-25T14:03:27.233 に答える
2

これは、現在のディレクトリがどれであるかを常に知り、他のディレクトリを使用するためのソリューションです

use strict;
use warnings;
use FindBin;
use File::Spec;
use Cwd;
BEGIN {
    $ENV{APP_ROOT} = Cwd::realpath(File::Spec->rel2abs($FindBin::Bin)) ;
}
#now you know your script directory, 
#no matter from where your script is called
#if you have Modules specific for your script which are in 
#a dir "lib" in the same dir as your script is
use lib  (
"$ENV{APP_ROOT}/lib",
);
my $config      = $ENV{APP_ROOT} . '/configuration/config.ini';
#Here is your script
#...
$output_file = "$ENV{APP_ROOT}/$output_dir/output.txt";

すべてのモジュールは CORE ディストリビューションに含まれているため、インストール済みです。Windows は「/」スラッシュを受け入れるため、そこでも使用できることに注意してください。

乾杯。

于 2009-04-26T18:28:30.257 に答える