Настройка сценариев Perl и реализация относительного пути в Windows (XP) / Unix (Solaris) - PullRequest
3 голосов
/ 25 апреля 2009

HEYLO,

Я испытываю некоторые сложности с разработкой сценариев на Perl. Я написал небольшой скрипт на Perl, используя стандартную (базовую) установку Perl. У меня есть следующие настройки:

C: \ MyScript \ perl.pl
C: \ MyScript \ Конфигурация \ 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

Ответы [ 2 ]

3 голосов
/ 25 апреля 2009

Проблема заключается в строке назначения $ config -

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

Это ищет config.ini из корневого каталога из-за начального '/', интерпретируя путь как абсолютный, а не относительный. Попробуйте изменить его на

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

Это будет работать только в том случае, если вы запустите скрипт perl из каталога «MyScript». Посмотрите на модуль FindBin для таких случаев, или вы можете манипулировать переменной $ 0, чтобы получить путь к Perl-скрипту.

2 голосов
/ 26 апреля 2009

Вот решение, чтобы всегда знать, какой у вас текущий каталог, и использовать другие ваши каталоги

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 принимает косые черты "/", поэтому вы также можете использовать их там.

Приветствие.

...