Comment maintenir le contenu d'une variable?
Résolu/Fermé
artagon7
Messages postés
417
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
12 novembre 2024
-
19 août 2023 à 15:34
artagon7 Messages postés 417 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 12 novembre 2024 - 30 août 2023 à 06:50
artagon7 Messages postés 417 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 12 novembre 2024 - 30 août 2023 à 06:50
A voir également:
- Comment maintenir le contenu d'une variable?
- Le fichier à télécharger correspond au contenu brut d’un courrier électronique. de quel pays a été envoyé ce message ? - Guide
- Word a trouvé du contenu illisible - Guide
- Ce contenu n'est pas disponible facebook - Forum Facebook
- Impossible de créer le fichier de travail. vérifiez la variable d'environnement temp ✓ - Forum Word
2 réponses
blux
Messages postés
26614
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
31 janvier 2025
3 325
Modifié le 22 août 2023 à 14:32
Modifié le 22 août 2023 à 14:32
Salut,
tu peux, si toutes les lignes contiennent un -, faire un split et mettre ça dans un tableau. Ca évite de gérer avec des regex (mais attention aux noms composés : haut-parleur, par exemple)
@TMP = split(/-/,$LIGNE_LUE);
Ensuite, dans $TMP[0], tu as le nom et dans $TMP[1], tu as les attributs.
Tu peux ensuite splitter les attributs (avec un séparateur vide, donc chaque caractère) et boucler sur le nouveau tableau créé.
Ca peut donner ça (je n'ai pas fait la boucle de lecture) :
#!/usr/bin/perl $mot = "bien-AN"; @TMP = split(/-/,$mot); $mot = $TMP[0]; @attribs = split(//,$TMP[1]); foreach my $attrib (@attribs) { print $mot."-".$attrib."\n"; }
Reste à gérer les exceptions (noms composés...).
blux
Messages postés
26614
Date d'inscription
dimanche 26 août 2001
Statut
Modérateur
Dernière intervention
31 janvier 2025
3 325
22 août 2023 à 17:10
22 août 2023 à 17:10
Sinon, quand tu passes une regex, $1, $2... $N sont réinitialisées.
Si tu veux les conserver, il faut les mettre ailleurs :
$TOTO = $1; $TATA = $2;
23 août 2023 à 15:00
Salut blux,
J'ai intégré une boucle de lecture à ton script. Ça ne fonctionne pas tout à fait (mais c'est près). Il y a deux failles :
1) Si la ligne se termine par une (ou des lettres majuscules), le script ajoute le mot avec un trait d'union à la fin du bloc, dans le fichier, ce qui ne doit pas être.
Exemple : Pour la ligne suivante :
bien-ABN
on doit avoir :
bien-A
bien-B
bien-N
et non pas :
bien-A
bien-B
bien-N
bien-
2) Entre les lignes qui contiennent des mots différents, il y a une ligne vide, entre eux, dans le fichier :
Voici mon programme :
Voici mes deux fichiers :
entree.txt
accrocher-V
aéronef-
agile-A
bien-ABN
éducatrice-AN
sortie.txt
accrocher-V
accrocher-
aéronef-
agile-A
agile-
bien-A
bien-B
bien-N
bien-
éducatrice-A
éducatrice-N
éducatrice-
Merci
Modifié le 24 août 2023 à 11:18
Non, pour moi, si on rajoute le mot avec un simple tiret, c'est qu'il y a un caractère supplémentaire (invisible) derrière les attributs.
Peux-tu ajouter la ligne suivante après le split de $tmp[1]:
Elle va donner la taille du tableau (le nb d'attributs) et c'est sûrement ici que tu verras qu'il y a un loup (3 au lieu de 2, par exemple).
Dont une explication pourrait être la suivante :
Tu es sous windows ou linux ? Il est possible que la fin de ligne soit considérée comme un caractère et donc traitée en tant qu'attribut.
Tu pourrais dans ce cas, faire un :
avant le split (ou le faire sur $LIGNE_LUE avant son split).
C'est sûrement ce qui fait que tu as une ligne entre chaque mot. En fait, on affiche le mot et son attribut mais comme l'attribut est très vraisemblablement un saut de ligne, ça donne ce résultat de ligne blanche en trop.
Tu peux aussi rajouter le module Data::Dumper en tête de programme avec :
et voir ce que contiennent les différentes variables :
Je pense que mon programme est correct depuis le début ;-))
En simplifiant, ça pourrait donner ça :
24 août 2023 à 16:36
Salut,
Je travaille sous Linux Mint.
Mon fichier d'entrée est :
accrocher-V
aéronef-
agile-A
bien-ABN
éducatrice-AN
1) J'ai fait ta ligne de commande "print scalar @attribs;" après le split de $tmp[1]:
Résultat : 21243
Donc, c'est correct : 2 (accrocher-V) // 1 (aéronef-) // 2 (agile-A) ...
2) Ta suggestion d'utiliser la commande chomp m'a rappelé que quelqu'un m'avait déjà conseillé d'utiliser cette commande, il y a longtemps, dans un autre script. J'aurais dû y penser.
J'ai ajouté ton autre ligne "chomp($tmp[1]);" avant le split, mais ça ne fonctionne pas correctement: si la ligne se termine par un trait d'union, le programme ne copie pas la ligne dans le fichier ...
Résultat :
accrocher-V
agile-A
bien-A
bien-B
bien-N
éducatrice-A
éducatrice-N
3) Si j'utilise la ligne de commande "print Dumper @attribs;" ça donne
$VAR1 = 'V';
$VAR1 = 'A';
$VAR1 = 'A';
$VAR2 = 'B';
$VAR3 = 'N';
$VAR1 = 'A';
$VAR2 = 'N';
Donc, pour la ligne "aéronef-", la variable $VAR1 n'a pas de contenu.
4) Ton programme fonctionne correctement si j'ajoute un espacement après le tiret, soit "aéronef- ". C'est ce que je vais faire je crois (ou simplement ajouter la lettre N pour les noms).
5) Dans les mots composés, je vais utiliser l'astérisque au lieu du trait d'union (arc*en*ciel) sinon, ça ne fonctionne pas. C'est simple ensuite de les remplacer, par la suite, par un tiret.
Je ne croyais pas que c’était aussi compliqué.
Merci
Modifié le 24 août 2023 à 16:55
Donc, il faut faire un test si scalar @attribs est égal à zéro pour ne pas passer dans la boucle d'affichage des attributs et n'afficher que le nom (en supposant que tu as fait le chomp).
Ca devrait résoudre pas mal de pb...
Et pourquoi ne mets-tu pas l'astérisque comme séparateur entre un mot et ses attributs ?
Dans ce cas, il faudra changer :
par
En Perl, ce qui sert de séparateur à la commande split est une expression régulière et comme l'astérisque a un rôle dans les regex, on la déspécialise avec un backslash (\).
Modifié le 25 août 2023 à 09:29
Ligne 45, mettre @attribs au lieu de $attribs, désolé. J'ai écrit sans tester...