2009-04-25 4 views
3

HEYLO,Perl конфигурация сценария и относительный путь реализация как на Windows (XP)/Unix (Solaris)

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

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

проблемы я имею, что s В строке econd ($ conf) появляется проблема с открытием файла в этом месте. Поскольку я буду использовать этот скрипт как в среде windows, так и в unix (без установки каких-либо модулей добавления), мне было интересно, как я могу обойти это? Я надеялся создать сценарий, который полностью настраивается через файл config.ini. Конфигурации, однако, работает только тогда, когда я даю это абсолютный путь, например:

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

Но так как это будет развернута в нескольких различных средах модифицирующих источник скриптов может быть и речи. Что бы вы, ребята, рекомендовали? Как подойти к такому сценарию?

Любая помощь и/или совет приветствуются.

Все самое лучшее, MC

ответ

3

Проблема заключается в строке $ назначениях конфигурации -

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

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

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

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

+0

Это сработало большое спасибо! Кроме того, мне пришлось создать пакетный файл и выполнить его в корневом каталоге скриптов. Выполнение его с Perl Express не сработало. Проблема решена без проблем! Спасибо! – 2009-04-25 16:59:30

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

Cheers.