[résolu] Lire un fichier de configuration

Lire un fichier de configuration [résolu] - Perl - Programmation

Marsh Posté le 17-07-2008 à 11:33:46    

Bonjour,
 
Je souhaite lire le contenu d'un fichier de configuration dans un script perl. J'utilise pour cela le module AppConfig.
 
Mon fichier test.pl
#!/usr/bin/perl -w
use Getopt::Std;
use AppConfig qw(:expand :argcount);
 
my $config = AppConfig->new('niveau' => ARGCOUNT => 1,'repertoire' => ARGCOUNT => 1);
$config->file('fichier.config');
print "niveau : ", $config->niveau(), "\n";
print "rep : ", $config->repertoire(), "\n";

 
Mon fichier de config
# mon fichier de config
niveau=26
repertoire=/tmp

 
Le problème c'est qu'à l'exécution j'obtiens ce résultat :
niveau : 1
rep : 1

Alors que je souhaiterais récupérer 26 et /tmp.
Auriez-vous une idée de ce qui n'est pas correcte dans mon script ?
Je précise que je ne connais pas bien perl.
 
Autre question : est-il possible d'appeler un script sh à partir d'un script perl ? et de  récupérer en retour de cet appel des données
 
Merci d'avance,


Message édité par ib@w le 06-08-2008 à 10:31:04
Reply

Marsh Posté le 17-07-2008 à 11:33:46   

Reply

Marsh Posté le 17-07-2008 à 12:11:54    

je connais mal appConfig, mais je dirais que cela te retourne des tableaux alors que tu attends des scalaires ( un réglage de ARGCOUNT ptêt).
Essaye ça juste pour vérifier:

Code :
  1. print ref $config->niveau();


 
Il est assez aisé d'appeler un script sh en perl, le mieux c'est encore de lire la doc


---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 17-07-2008 à 15:03:46    

La commande print ref $config->niveau(); ne renvoit rien malheureusement.
 
Pour appeler un script, j'ai utilisé la commande system() mais à priori cela ne permet de retourner que le code retour $? (pas de chaîne de caractère).. en fait je comptais récupérer les valeurs de mon fichier de conf ainsi, c'est raté.
 
Une autre solution, j'imagine, serait de lire le fichier en perl et de récupérer les champs via une expression régulière ?

Reply

Marsh Posté le 17-07-2008 à 15:19:33    

ib@w a écrit :

La commande print ref $config->niveau(); ne renvoit rien malheureusement.


Comment ça renvoie rien??? ça doit forcément afficher quelque chose :/

 
ib@w a écrit :

Pour appeler un script, j'ai utilisé la commande system() mais à priori cela ne permet de retourner que le code retour $? (pas de chaîne de caractère).. en fait je comptais récupérer les valeurs de mon fichier de conf ainsi, c'est raté.


mauvaise idée

 
ib@w a écrit :

Une autre solution, j'imagine, serait de lire le fichier en perl et de récupérer les champs via une expression régulière ?


Oui tu peux aussi faire ça c'est pas bien dur et ça doit s'écrire en 3 lignes:

Code :
  1. my %config;
  2. while(<FH> ){
  3.  /^\s*(.*?)\s*=\s*(.*?)\s*$/;
  4.  $config{$1} = $2;
  5. }


Maintenant utiliser AppConfig ça reste une excellente idée aussi ...

 

Message cité 1 fois
Message édité par anapajari le 17-07-2008 à 15:20:14

---------------
Software and cathedrals are much the same - first we build them, then we pray.
Reply

Marsh Posté le 17-07-2008 à 16:03:55    

anapajari a écrit :


Comment ça renvoie rien??? ça doit forcément afficher quelque chose :/


ça donnait avec mon code :
niveau :
rep :

anapajari a écrit :


Oui tu peux aussi faire ça c'est pas bien dur et ça doit s'écrire en 3 lignes:

Code :
  1. my %config;
  2. while(<FH> ){
  3.  /^\s*(.*?)\s*=\s*(.*?)\s*$/;
  4.  $config{$1} = $2;
  5. }


Maintenant utiliser AppConfig ça reste une excellente idée aussi ...


Merci, effectivement avec cela ça fonctionne, mis en forme pour ceux que ça intéresse et pour avoir un exemple concret, voilà ce que j'ai fait (ça pourra pitêtre servir à d'autres noob comme moi  :) ) :
#!/usr/bin/perl
use strict;
system("clear" );
my $file="fichier.config";
open(FIC,$file) || die("Could not open file!" );
my @raw_data=<FIC>;
close(FIC);  
 
my $repertoire="";
my $niveau="";
my %config;
while(<@raw_data> ){
/^\s*(.*?)\s*=\s*(.*?)\s*$/;
$config{$1} = $2;
if ($1 eq "repertoire" )
 {  
 $repertoire=$2;
 }
elsif ($1 eq "niveau" )
 {
 $niveau=$2;
 }
}
print "repertoire=",$repertoire,"\n";
print "niveau=",$niveau,"\n";

 
J'étais parti sur une autre solution qui s'en rapproche :
#!/usr/bin/perl
use strict;
system("clear" );
my $file="fichier.config";
open(FIC,$file) || die("Could not open file!" );
my @raw_data=<FIC>;
close(FIC);
 
my $repertoire="";
my $niveau="";
 
foreach my $wrestler (@raw_data)
{
 chomp($wrestler);
 (my $var,my $value)=split(/\=/,$wrestler);
 
 if ($var eq "repertoire" )
 {  
 $repertoire=$value;
 }
 elsif ($var eq "niveau" )
 {
 $niveau=$value;
 }
}
 
print "repertoire=",$repertoire,"\n";
print "niveau=",$niveau,"\n";

 
Résultat à l'écran :
repertoire=/tmp
niveau=26

 
Je ne sais pas si c'est du code très optimisé mais ça fonctionne.

Reply

Marsh Posté le 22-07-2008 à 03:42:17    

Les exemples de la doc étaient pourtant assez simples.

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use AppConfig qw(:expand :argcount);
  5. my $config = AppConfig->new();
  6. $config->define("niveau", {ARGCOUNT => ARGCOUNT_ONE});
  7. $config->define("repertoire", {ARGCOUNT => ARGCOUNT_ONE});
  8. $config->file('fichier.config');
  9. print "niveau : ", $config->niveau, "\n";
  10. print "rep : ", $config->repertoire, "\n";


Ca marche tres bien.
 
Un truc comme ceci en perl: 'niveau' => ARGCOUNT => 1  avec deux => successifs, ca a peu de chances de marcher.  
 
Par contre, c'était peut être quelque chose comme ceci que tu voulais faire:

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use AppConfig qw(:expand :argcount);
  5. my $config = AppConfig->new("niveau"     => {ARGCOUNT => ARGCOUNT_ONE},
  6.                             "repertoire" => {ARGCOUNT => ARGCOUNT_ONE});
  7. $config->file('fichier.config');
  8. if (defined($config->niveau)) {print "niveau : ", $config->niveau, "\n"};
  9. if (defined($config->repertoire)) {print "rep : ", $config->repertoire, "\n"};


 
A+,


Message édité par gilou le 22-07-2008 à 04:45:05

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 22-07-2008 à 11:17:38    

Arfff mes sources n'étaient pas bonnes http://docs.mandragor.org/files/Mi [...] onfig.html ...  
Merci pour la correction, je leur ai envoyé un petit mail aussi.
@+

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed