[Perl] foreach commande

Résolu
Salut à vous!

Je plante le décor.

J'ai un fichier pays.txt:
$$COUNTRY=DE;PT;CZ;RO

J'ai un fichier de paramétre:param.txt
$$COUNTRY=

J'ai une commande qui est capable de lire le fichier de parametre:ma_commande()

J'ai un script perl qui change la valeur de param.txt:
la commande s'écrit:
./change_param.pl pays.txt param.txt

et en résultat j'ai dans param.txt:
$$COUNTRY=DE;PT;CZ;RO

Le but est de parcourir le fichier pays.txt,mettre à jour param.txt et lancer successivement ma_commande pays par pays.

Le programme devrait faire ça:

je lis pays.txt
je récupere le premier pays 'DE'.
je lance change_param qui met à jour param.txt $$COUNTRY=DE
je lance ma commande ma_commande
etc...pour PT , CZ et RO.

C'est cette notion de boucle que je ne sais pas faire....

5 réponses

  1. Modérateur
    Re,

    regarde ça et dit si ça te convient.
    #!/usr/bin/perl
    use warnings;use strict;
    
    my @pays;
    
    open F_PAYS,"pays.txt"     or die "E/S : $!\n";
    
    while ( <F_PAYS> ) {       # je lit pays.txt
      s/(.*)/$1;/;             # j'ajoute un ; à la fin pour créer @pays
      @pays = $_ =~ /(\w\w);/g;# je stocke les pays
    }
    
    # param.txt ne contient que $$COUNTRY=  ??
    # en ce cas je ne crois pas que tu as besoin de ce fichier
    # tu peux utiliser une variable
    # donc l'étape ./changer_param.pl pays.txt param.txt tu peux la sauter
    #
    my $param ='$$COUNTRY=';
    
    foreach (@pays){
       system ("echo", "$param$_"); # tu remplaces echo avec ma_commande
    }
    

    Et même sans variable
    #!/usr/bin/perl
    use warnings;use strict;
    
    my @pays;
    
    open F_PAYS,"pays.txt"     or die "E/S : $!\n";
    
    while ( <F_PAYS> ) {       # je lit pays.txt
      s/(.*)/$1;/;             # j'ajoute un ; à la fin pour créer @pays
      @pays = $_ =~ /(\w\w);/g;# je stocke les pays
    }
    
    # param.txt ne contient que $$COUNTRY=  ??
    # en ce cas je ne crois pas que tu as besoin de ce fichier
    # donc l'étape ./changer_param.pl pays.txt param.txt tu peux la sauter
    
    foreach (@pays){
       system ("echo", '$$COUNTRY='."$_"); # tu remplaces echo avec ma_commande
    }
    lami20j
    1. Modérateur
      Tu peux éclater ta variable et la mettre dans un tableau avec split :

      @PAYS = split(/;/,$$COUNTRY)

      Ensuite, tu boucles sur ton tableau avec :
      for $i (0..$#PAYS)

      Ca irait ?
      1. Ma commande c'est vraiment spécifique, c'est pas utile de rentrer dans le détail:ce qui est important c'est que change_param.pl(script perl qui modifie dans param.txt et en prenant deux parametres, le fichier contenant le contenu de variable $$COUNTRY et le fichier param à mettre à jour) mette à jour la variable pour qu'à l'execution de ma_commande, il est la bonne variable pays.

        J'ai essayé ça,

        open VAR,pays.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 = <RES>;
        my %h;

        while (<VAR>){
        --c'est ici que je sais pas comment découper par $$COUNTRY=DE;PT;RO; et mettre dans VAR successivement DE puis PT puis RO
        print $$COUNTRY=DE; RES;
        exec(./change_param.pl RES PARAM);
        exec(ma_commande);
        }

        Merci Lamij
        1. Modérateur
          Salut,

          je crois que tu peux le faire tout d'un coup.

          je lis pays.txt
          je récupere le premier pays 'DE'.
          je lance change_param qui met à jour param.txt $$COUNTRY=DE
          je lance ma commande ma_commande
          etc...pour PT , CZ et RO.


          je vois comme ça, mais je ne suis pas sûr si je n'ai pas les détails

          je lis pays.txt
          je récupere les pays
          je met à jour param.txt

          Ca sera mieux si tu peux afficher les codes que tu as.
          ma_commande c'est quoi?
          change_param.pl ?

          Si on peut le faire avec un seul script, pourquoi pas?
          A toi de voir. Peut être tu as tes raison.

          A savoir que t'as commande tu peux l'utiliser depuis le script.

          As-tu commencé un bout de code?
          Pas forcémént foreach si un while sur un handle de fichier fait l'affaire.

          A toi.

          lami20j

          P.S. foreach ce n'est pas une commande mais une instruction