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

我遇到的问题是第二行($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 回答