2009-04-25 5 views
3

HEYLO,Script Perl Configuration et mise en œuvre de chemin relatif sur Windows (XP)/Unix (Solaris)

je rencontre, en quelque sorte, un casse-tête en ce qui concerne le développement de script perl. J'ai écrit un petit script Perl en utilisant l'installation Perl standard (basique). J'ai la configuration suivante:

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

C'est le perl Source .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; 

Ceci est le contenu config.ini:

[output] 
output_dir = C:\MyScript\output 

Le problème que j'ai est que le s La ligne econd ($ conf) semble avoir du mal à ouvrir le fichier à cet emplacement. Comme je vais utiliser ce script dans un environnement windows et unix (sans installer de modules d'addition) je me demandais comment je pourrais contourner cela? Ce que j'espérais était de créer un script entièrement configurable via le fichier config.ini. La configuration cependant, ne fonctionne que si je lui donne son chemin absolu, comme si:

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

Mais puisque ce sera déployé dans plusieurs environnements différents modifier la source des scripts est hors de question. Que recommanderiez-vous les gars? Comment devrait-on aborder un tel scénario?

Toute aide et/ou conseil est grandement appréciée.

Tous les meilleurs, MC

Répondre

3

Le problème réside dans la ligne d'affectation de $ config -

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

Ceci recherche config.ini à partir du répertoire racine en raison du premier '/', interprétation le chemin comme absolu plutôt que relatif. Essayez de le changer en

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

Ceci ne fonctionnera que si vous exécutez le script Perl depuis le répertoire 'MyScript'. Jetez un oeil au module FindBin pour de tels cas ou vous pourriez manipuler la variable $ 0 pour obtenir votre chemin de script Perl.

+0

Cela a fonctionné super merci! À l'exception, j'ai dû créer un fichier batch et l'exécuter sur la racine des scripts. L'exécuter à partir de Perl Express n'a pas fonctionné. Problème résolu aucun-le-moins! Merci! –

2

Voici une solution pour savoir AllWays qui est votre répertoire courant et utilisez vos autres dirs

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"; 

Tous les modules sont de la distribution de base afin que vous les avez installés. Notez que Windows accepte les barres obliques "/", vous pouvez donc également les utiliser.

Cheers.

Questions connexes