Modification du nom d'un pointeur dans une boucle - Forum Perl

A voir également:Modification du nom d'un pointeur dans une boucleEchec de la modification du nom dsn ✓ - Forum - Windows Outlook modification du nom de l'expediteur ✓ - Forum - Messagerie Modification du nom d'enregistrement dans une macro Excel ✓ - Forum - Excel Modifications des noms des boutons et des onglets ✓ - Forum - Excel Modification du nom de pc portable ✓ - Forum - Windows

Bonjour,

J'ai écrit un programme qui cherche des rimes dans deux fichiers qui contiennent des mots qui commencent respectivement par "a" et "b". Lorsque le programme trouve un mot qui finit par une certaine terminaison, il l'ajoute dans le fichier correspondant au rime en question. Si un mot ne possède aucune terminaison qui est spécifée, le programme le met dans le fichier reste_(premiere lettre du mot).txt

#!/usr/bin/perl  open(FICHIER_BANQUE_DE_MOTS_A, "banque_a.txt") or die "Le fichier ne s'ouvre pas: $!"; open(FICHIER_BANQUE_DE_MOTS_B, "banque_b.txt") or die "Le fichier ne s'ouvre pas: $!"; open(FICHIER_RIMES_AIL, ">rimes_ail.txt") or die "Le fichier ne s'ouvre pas: $!"; open(FICHIER_RIMES_AN, ">rimes_an.txt") or die "Le fichier ne s'ouvre pas: $!"; open(FICHIER_RIMES_O, ">rimes_o.txt") or die "Le fichier ne s'ouvre pas: $!"; open(FICHIER_RESTES_A, ">restes_a.txt") or die "Le fichier ne s'ouvre pas: $!"; open(FICHIER_RESTES_B, ">restes_b.txt") or die "Le fichier ne s'ouvre pas: $!";  while(<FICHIER_BANQUE_DE_MOTS_A>) { $x = "$_";    if ((/ail$/) or (/aille$/)) {print FICHIER_RIMES_AIL "$_"} else  {if ((/an$/) or (/anc$/) or (/ant$/) or (/ent$/)) {print FICHIER_RIMES_AN "$_"} else  {if ((/au$/) or (/aud$/) or (/aut$/) or (/eau$/) or (/o$/) or (/ot$/) or (/ôt$/))  {print FICHIER_RIMES_O "$_"} else {print FICHIER_RESTES_A "$_"}; } }  }   while(<FICHIER_BANQUE_DE_MOTS_B>) { $x = "$_";  if ((/ail$/) or (/aille$/)) {print FICHIER_RIMES_AIL "$_"} else  {if ((/an$/) or (/anc$/) or (/ant$/) or (/ent$/)) {print FICHIER_RIMES_AN "$_"} else  {if ((/au$/) or (/aud$/) or (/aut$/) or (/eau$/) or (/o$/) or (/ot$/) or (/ôt$/))  {print FICHIER_RIMES_O "$_"} else {print FICHIER_RESTES_B "$_"}; } }  }   close FICHIER_BANQUE_DE_MOTS_A; close FICHIER_BANQUE_DE_MOTS_B; close FICHIER_RIMES_O; close FICHIER_RIMES_AIL; close FICHIER_RIMES_AN; close FICHIER_RESTES_A; close FICHIER_RESTES_B; 

Voici les deux fichiers de données que j'ai utilisés.

banque_a.txt
aloyau an artichaut attirail avant avoir 

banque_b.txt
 barreau bataille bateau blanc boire bordereau 

Le programme fonctionne bien. Cependant, je veux l'appliquer à 26 fichiers (a à z).

Au lieu d'utiliser 26 boucles WHILE, je voudrais en avoir une seule dans laquelle je changerais le nom du pointeur. Ce serait beaucoup plus court. Mais surtout, si je dois apporter une modification dans la boucle, j'évite de le faire dans les 25 autres ...

Ainsi :
FICHIER_BANQUE_DE_MOTS_A deviendrait FICHIER_BANQUE_DE_MOTS_B puis deviendrait FICHIER_BANQUE_DE_MOTS_C ...

De même le pointeur FICHIER_RESTES_A deviendrait FICHIER_RESTES_B ... etc ...

Est-ce qu'il est possible de changer le nom d'un pointeur dans une boucle?

Je pourrais utiliser des chiffres au lieu de lettres. Je peux changer FICHIER_RESTES_A en FICHIER_RESTES_1 si ça simplifie les choses.

Merci

Forum

A voir également:Modification du nom d'un pointeur dans une boucleEchec de la modification du nom dsn ✓ - Forum - Windows Outlook modification du nom de l'expediteur ✓ - Forum - Messagerie Modification du nom d'enregistrement dans une macro Excel ✓ - Forum - Excel Modifications des noms des boutons et des onglets ✓ - Forum - Excel Modification du nom de pc portable ✓ - Forum - Windows

Web: www.shapebootstrap.net

1 réponse

Marsh

NOVEMBER 9, 2013 AT 9:15 PM

Salut artagon7,

As-tu besoin que les 26 fichiers soient ouverts en même temps (comme dans ton code où tu ouvres le fichier banque de mots en A et banque de mots en B), ou est-ce suffisant de les ouvrir un par un dans ta boucle (puisque dans ton code, tu les traites de toutes façon indépendamment) ?

1.

Si tu n'as pas besoin de les ouvrir tous en même temps, tu peux simplement :

- créer un tableau des noms de fichiers banque de mots
- itérer sur ce tableau des noms de fichiers (par exemple avec une boucle foreach)
- dans la boucle foreach ouvrir le fichier en question, en traiter le contenu et fermer le fichier

https://perlmaven.com/perl-arrays

2.

Si tu as vraiment besoin de les ouvrir tous en même temps (cela fait pas mal de ressources consommées sur un système) c'est faisable aussi si tu utilises des variables pour tes descripteurs de fichiers, au lieu d'identifiants globaux (je t'avais déjà indiqué que cette pratique est obsolète et peut poser des problèmes, outre le fait que tu n'utilises pas

use strict;
et
use warnings;
).

Tu peux les traiter dans une structure de données Perl comme un tableau ou un hash (le hash étant certainement plus approprié ici), et itérer dessus.

https://perlmaven.com/perl-hashes


Dal

Reply
réponses:
  • auteur

  • auteur

    Salut Dal,

    1) Non, je n'ai pas besoin d'ouvrir tous les tableaux en meme temps;

    2) J'ai utilisé un vieux fichier pour éditer mon programme d'où l'omission des lignes
    use strict;
    use warnings;


    Je vais les mettre dans un fichier gabarit à partir de maintenant. Merci du rappel.

    J'ai fait la lecture des références que tu as données et j'ai écrit le simple programme (qui ne fonctionne pas) suivant:

    #!/usr/bin/perl  use strict; use warnings;  open(FICHIER_RIMES_AIL, ">rimes_ail.txt") or die "Le fichier de rimes ne s'ouvre pas: $!";  my @fichier = ("banque_a.txt", "banque_b.txt");  foreach my $n (@fichier) {  open(PNTR_FICHIER, $fichier[$n]) or die "Le fichier de mots ne s'ouvre pas: $!"; say $n; say $fichier[$n];  close PNTR_FICHIER; }  close FICHIER_RIMES_AIL; 


    Messages d'erreur :

    Argument "banque_a.txt" isn't numeric in array element at test_avec_tableau.pl line 14.

    Can't locate object method "say" via package "banque_a.txt" (perhaps you forgot to load "banque_a.txt"?) at test_avec_tableau.pl line 15.


    Le fichier banque_a.txt est dans le même répertoire que mon programme Perl test_avec_tableau.pl.

    Merci

  • auteur

    Salut artagon7,

    Avec Perl, comme dans d'autres langages, une boucle

    foreach
    te permet d'itérer sur les éléments d'un objet. Dans le code :

    my @fichier = ("banque_a.txt", "banque_b.txt");  foreach my $n (@fichier) {

    les éléments du tableau
    @fichier
    sont successivement mis dans
    $n
    à chaque itération.

    Comme ce tableau est un tableau de chaînes de caractères représentant tes noms de fichiers, dans la 1ère itération,
    $n
    vaut "banque_a.txt", dans la 2ème "banque_b.txt".

    Tu n'as pas besoin d'utiliser un indice.

  • auteur

    Salut Dal,

    Si je te comprend bien, il me suffit simplement de supprimer $n. J'aurai donc la partie corrigée suivante:

    foreach my (@fichier) { open(PNTR_FICHIER, $fichier) or die "Le fichier de mots ne s'ouvre pas: $!"; say $fichier;  close PNTR_FICHIER; } 

    Je vais l'essayer. Merci.

  • auteur

    Salut Dal,

    J'ai enlevé la variable $n.

    Après quelques essais et changements, ma
    ligne 10 est devenue :

    foreach my $fichier (@fichier)

    C'est correct.

    Le message d'erreur concerne maintenant la ligne :

    $x = "$_";

    Global symbol "$x" requires explicit package name at test_avec_tableau_2.pl line 13.

    Cette ligne fonctionnait pourtant bien dans la boucle while que j'avais utilisée dans le programme qui est dans mon premier message.

    Au lieu d'être dans une boucle while, elle est dans une boucle foreach. Ça devrait fonctionner.

    Je ne comprends pas...

  • auteur

    En mode strict, les variables doivent être déclarées avant d'être utilisées.

    Tu déclares une variable

    $x
    dans ton programme en faisant
    my $x;
    .

    Tu peux aussi directement faire :
    my $x = "$_"; 
    pour déclarer la variable et immédiatement lui assigner quelque chose.

  • auteur

    Salut Dal,

    Le fait de déclarer la variable a fonctionné.
    Je vais revenir d'ici une semaine (quand je serai moins occupé) pour clore le sujet car au début ça ne fonctionnait pas.

    Merci.

Leave a Replay

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