[PERL] Parse d'un fichier de configuration

Parse d'un fichier de configuration [PERL] - Perl - Programmation

Marsh Posté le 02-06-2006 à 08:50:34    

Bonjour,
 
Je souhaite extraite d'un fichier de configuration quelques lignes, jusqu'à la rien d'extraordinaire, sauf peut être pour un novice !
Voici une partie de mon fichier de configuration :


# Config File
#
# Create and configure extension PC
#
extension PC set lang=FR
extension PC set timeoffset=7200
...
#
# Create and configure user PC_10
#
user PC_10 set addr=10.10.10.10
user PC_10 set dhcp=disable
...
user PC_10 set ping-timeout=300
#
# Create and configure user PC_11
#
...


Je souhaite récupérer uniquement les éléments user PC_10, user PC_11....
Vu que je ne connais pas le nombre de PC avant l'exécution du script, je commence par selectionner les lignes de commentaires :

Code :
  1. my $FILE = "/home/masterlolo/config.pc";
  2. my ($LIGNE, @PC, $PC, @DATA, $DATA);
  3. if (-e $FILE)
  4.     {
  5.     open (FILE, "$FILE" );
  6.     foreach $LIGNE (<FILE> )
  7.         {
  8.         chomp $LIGNE;
  9.         if ($LIGNE =~ /# Create and configure user/)
  10.             {
  11.             @DATA = split (/# Create and configure user /, $LIGNE);
  12.             push(@PC,@DATA);
  13.             }
  14.         }
  15.     }
  16. print ("@PC" );


Le résultat est alors :

 PC_10  PC_11  PC_12


Ce qui me gène dans ce résultat, c'est qu'entre chaque nom des PC, il y a un double espace !
Je n'arrive pas à savoir d'où il provient !
 
Ensuite, je pense que je n'aurai plus qu'a relire @PC, et extraire les données comme addr, dhcp, ... , ping-timeout.
Mais j'aimerai un avis avant de continuer, est-ce que je ne suis pas entrein de créer une usine à gaz ? :??:
 

Reply

Marsh Posté le 02-06-2006 à 08:50:34   

Reply

Marsh Posté le 02-06-2006 à 09:35:25    

est-ce que c'est pas un peu dangereux de te baser uniquement sur les commentaires ? (étant donné que les commentaires ne sont pas obligatoires, tu pourrais te retrouver avec un bloc de définition de PC_xx non commenté ou commenté sous une autre forme que celle que tu attends)
 
sinon, comment tu veux procéder après ? tu veux utiliser des hashmaps pour stocker les valeurs lues ?
 
 
Pour ton problème de détection des PC_xx, je procèderais ainsi :

Code :
  1. if( $LIGNE =~ /^\# Create and configure user (PC_\d+)/ )
  2. {
  3.   push( @PC, $1 );
  4. }


 
normalement, tu devrais éviter les espaces indésirés...

Message cité 1 fois
Message édité par franceso le 02-06-2006 à 09:36:35

---------------
TriScale innov
Reply

Marsh Posté le 02-06-2006 à 10:32:23    

Il y a pas mal de modeuls de parsing de fichier de configuration sur cpan (search.cpan.org), chacun specialisé dans tel ou tel format.
Il existe aussi un parser "automatique" qui pourrait bien marcher directement pour toi: Config::Auto
http://search.cpan.org/~cosimo/Config-Auto/

Reply

Marsh Posté le 04-06-2006 à 13:35:29    

franceso a écrit :

est-ce que c'est pas un peu dangereux de te baser uniquement sur les commentaires ?


Ce n'est pas faux !
 
J'ai revu ma méthode pour extraire mes données :
 
1/ Je met le fichier dans un tableau
2/ Sur le tableau, j'utilise les lignes commençant par user et j'extrait les informations.
3/ J'affiche pour vérifier le résultat
 
cela fonctionne à priori sur mon fichier, je n'ai pas encore eu d'erreur lors de l'execution.
mais je suis prenneur de tous les commentaires :)
 

Code :
  1. my $FILE = "/home/masterlolo/config.pc";
  2. my ($LIGNE, @LIGNE, $DATA, @FILE, $CHAMP);
  3. if ( -e $FILE)
  4. {
  5.  open (FILE, "$FILE" );
  6.  @FILE = <FILE>;
  7.  close (FILE);
  8.  @FILE = grep(/^user\\s/, @FILE);
  9.  foreach $DATA (@FILE)
  10.  {
  11.   @LIGNE = split(/^user\\s/,$DATA);
  12.   foreach $LIGNE (@LIGNE)
  13.   {
  14.                                                    # Traitement des lignes en UNSET
  15.    if ($LIGNE =~ /\\sunset\\s/)
  16.    {
  17.     my ($USER,$TRASH,$CHAMP) = split(/\\s+/,$LIGNE);
  18.     $CHAMP =~ s/-/_/g;
  19.     print "[DEBUG] $CHAMP=unset pour $USER; \n";
  20.    }
  21.                                                    # Traitement des lignes en SET
  22.    if ($LIGNE =~ /\\sset\\s/)
  23.    {
  24.     my ($USER,$TRASH,$SET) = split(/\\s+/,$LIGNE);
  25.     ($CHAMP, $SET) = split(/=+/,$SET);
  26.     $CHAMP =~ s/-/_/g;
  27.     print "[DEBUG] $CHAMP='$SET' pour $USER; \n";
  28.    }
  29.   }
  30.  }
  31. }
  32. else
  33. {
  34.  print ("$FILE introuvable !" );
  35. }


Message édité par masterlolo le 04-06-2006 à 13:39:41
Reply

Sujets relatifs:

Leave a Replay

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