Perl et Variable

Bonjour à tout les fans de Perl!
Mon probléme:
J'ai un fichier de variable:var.txt
$$DATE1=01/01/79
$$DATE2=01/01/80

Un fichier de parametre param.txt
$$DATE1=05/05/05
$$DATE2=06/06/06

Comment remplacer les valeurs de param.txt par celle de var.txt?
Je veux à la fin avoir dans param.txt:
$$DATE1=01/01/79
$$DATE2=01/01/80
Je sais le faire en shell pour ceux que ça interesse:
********************************************************
if [[ $# -lt 2 ]]
then
Usage
exit 2
fi

VAL_FILE=$1
CFG_FILE=$2
FICHIER_TMP=./tmp_file.txt

cat $VAL_FILE | while read line
do
to_seek=`echo $line | cut -d\= -f1`
nb_occur=`grep $to_seek $CFG_FILE | wc -l`
sed "s,$to_seek=.*,$line,g" $CFG_FILE > $FICHIER_TMP
mv $FICHIER_TMP $CFG_FILE
#echo $line ' --> '$nb_occur ' ligne(s) modifiés) !'
done

********************************************************

J'ai du mal en perl...Merci au fan

12 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Salut,

    Mon probléme: 
    J'ai un fichier de variable:var.txt 
    $$DATE1=01/01/79 
    $$DATE2=01/01/80 
    
    Un fichier de parametre param.txt 
    $$DATE1=05/05/05 
    $$DATE2=06/06/06 
    
    Comment remplacer les valeurs de param.txt par celle de var.txt? 
    Je veux à la fin avoir dans param.txt: 
    $$DATE1=01/01/79 
    $$DATE2=01/01/80 
    Je sais le faire en shell pour ceux que ça interesse: 


    Je ne comprends pas ta question.
    En fait le fichier param.txt va contenir le contenu du fichier var.txt.

    Donc même en shell tu peux faire plus simple

    cat var.txt > param.txt

    Plus des détails s'il te plaît.Merci.

    lami20j
    1. C'est pas trés clair c'est vrai.

      Le fichier de variable:var.txt
      $$DATE1=01/01/79
      $$DATE2=01/01/80

      Un fichier de parametre param.txt
      blabla
      $$DATE1=05/05/05
      $$DATE2=06/06/06
      blabla

      Le but est de lancer une commande du type
      perl.pl var.txt param.txt

      le perl.pl parse le fichier var.txt et initialise les valeurs de param.txt pour obtenir en sortie:
      blabla
      $$DATE1=01/01/79
      $$DATE2=01/01/80
      blabla

      Chaque fois qu'une variable existante dans var.txt est retrouvé dans param.txt, il change la valeur de param.txt par celle figurant dans var.txt...C'est le principe d'un fichier de paramétre que l'on initialise par un autre....
      C'est plus clair?;D
      1. Modérateur
        Salut,

        je sais ce que tu veux.

        En revanche j'ai besoin de savoir si tes fichiers contient autre chose à part les lignes de genre

        $$DATE1=01/01/79
        $$DATE2=01/01/80

        Merci.

        lami20j
        1. Oui on pourrait imaginer:
          var.txt:
          $$VAR1=01/01/01979
          $$VAR2=toto
          $$VAR3=3

          param.txt (avant le passage du perl)
          $var4=titi
          $VAR1=01/01/1970
          [des autre variables]
          $$VAR2=tonton
          [du blabla]
          $$VAR3=4

          et hop aprés le perl param.txt devient:
          $var4=titi
          $VAR1=01/01/01979
          [des autre variables]
          $$VAR2=titi
          [du blabla]
          $$VAR3=3

          Dans var.txt y'a que des données du type:$$var=?

          apres dans param, c'est au perl que retrouver les $$var et de changer leur valeurs....pas simple j'avoue...
          1. Modérateur
            Re,

            tu as une aproche ici
            http://www.clubic.com/forum/remplacement-de-chaines-de-caracteres-t344302.html

            voir ma dernière réponse et aussi la réponse de jipicy en shell.

            Entre temps je vais essayer d'adapter à ton cas.

            lami20j
            1. Modérateur
              Re,

              Le script
              #! /usr/bin/perl
              
              use warnings;
              use strict;
              
              open VAR,"var.txt" or die "E/S : $!\n";
              open PARAM,"param.txt" or die "E/S : $!\n";
              open RES,">resultat.txt" or die "E/S : $!\n";
              
              my @p = <PARAM>;
              my %h;
              
              while (<VAR>){
                my ($x,$y) = $_ =~ /\$\$(.*)=(.*)/;
                $h{$x} = $y;
              }
              
              map {for my $e(keys %h){ if ($_ =~ /(.*)$e=?.*/){ $_=~ s/.*/\$\$$e=$h{$e}/}}} @p;
              print RES @p;
              Le résultat

              Le fichier var.txt
              [lamitest@localhost my_perl_script]$ cat var.txt
              $$DATE1=01/01/79
              $$DATE2=01/01/80
              $$var100=10/10/10
              $$VAR1=01/01/01979
              $$VAR2=toto
              $$VAR3=3
              [lamitest@localhost my_perl_script]$
              
              Le fichier param.txt
              [lamitest@localhost my_perl_script]$ cat param.txt
              $$DATE1=05/05/05
              hfgh
              $$DATE2=06/06/06
              sdf
              $$var100=ksdjfklj
              yyyyy
              $$var=OOOOO
              $var4=titi
              $VAR1=01/01/1970
              [des autre variables]
              $$VAR2=tonton
              [du blabla]
              $$VAR3=4
              
              L'exécution du script et le résultat (j'ai préfèré d'enregistrer le résultat dans le fichier resultat.txt et de garder le fichier param.txt.
              [lamitest@localhost my_perl_script]$ perl ccm_line.pl
              [lamitest@localhost my_perl_script]$ cat resultat.txt
              $$DATE1=01/01/79
              hfgh
              $$DATE2=01/01/80
              sdf
              $$var100=10/10/10
              yyyyy
              $$var=OOOOO
              $var4=titi
              $$VAR1=01/01/01979
              [des autre variables]
              $$VAR2=toto
              [du blabla]
              $$VAR3=3
              [lamitest@localhost my_perl_script]$
              
              Je n'ai pas utilisé les fichiers en tant qu'arguments pour le script. En revanche j'ai ouvert 3 handle de fichiers (2 en lecture et un en écriture).

              Si ça ne te convient pas comme ça ou tu essaies de modifier le script ou tu fait un signe.

              lami20j
              1. Modérateur
                Re,

                A ajouter à la fin de script si tu veux que le fichier resultat.txt devient param.txt
                rename 'resultat.txt','param.txt';
                lami20j
                1. Modérateur
                  Re,

                  Pour encore reduire la saisie et rendre la ligne
                  map {for my $e(keys %h){ if ($_ =~ /(.*)$e=?.*/){ $_=~ s/.*/\$\$$e=$h{$e}/}}} @p;
                  encore plus condesé tu peux écrire
                  
                  map {for my $e(keys %h){if (/(.*)$e=?.*/){s/.*/\$\$$e=$h{$e}/}}} @p;


                  Si tu veux l'écrire come une boucle while tu peux faire comme ça
                  
                  map {
                   for my $e(keys %h){
                     if ($_ =~ /(.*)$e=?.*/){
                       $_=~ s/.*/\$\$$e=$h{$e}/
                     }
                   }
                  } @p;
                  ou
                  
                  map {
                   for my $e(keys %h){
                     if (/(.*)$e=?.*/){
                       s/.*/\$\$$e=$h{$e}/
                     }
                   }
                  } @p;

                  lami20j
                  1. Re,

                    Pourquoi quand dans var.txt, j'ai:
                    $$DATE1=01/01/79

                    et dans param.txt,j'ai
                    dubalbadevantlavariable.$$DATE1=24/04/06

                    dans resultat.txt je me retrouve avec
                    $$DATE1=01/01/79

                    alors que j'attends
                    dubalbadevantlavariable.$$DATE1=01/01/79

                    ....merci en tout cas,super boulot....
                    1. Modérateur
                      Salut,

                      puisque tu n'as pas parler de cette situation.

                      Mais est-ce que ça marche comme tu veux?
                      Sinon, dit le pour que je puisse faire des modifications.

                      lami20j
                  2. ....il faut remplacer le .* par \$\$$e(.*) dans le dernier sed...

                    ça marche hyper bien!