Bonjour,
J'ai une chaîne de caractères : Lire:des:Histoires:droles
et j'aimerais remplacer uniquement avant le premier deux-points par le mot Ecrire.
Je débute sous Perl, j'ai pensé aux expressions régulières ...
Merci de votre aide.
Bonjour,
J'ai une chaîne de caractères : Lire:des:Histoires:droles
et j'aimerais remplacer uniquement avant le premier deux-points par le mot Ecrire.
Je débute sous Perl, j'ai pensé aux expressions régulières ...
Merci de votre aide.
Quelque chose comme ceci devrait faire l'affaire, mais il faudrait que tu détailles un peu plus ton besoin :
Code : Sélectionner tout - Visualiser dans une fenêtre à part $texte =~ s/^\w(:)/Ecrire$1/;
Après tu peux aussi séparer ta chaine pour les mettre dans un tableau.
Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 my $chaine="Lire:des:Histoires:droles";#Ta chaine de caractère my @tab=split(/:/,$chaine);#Le caractère de séparation est ":" $tab[0]="Ecrire";#Tu remplaces "Lire" par "Ecrire" print "@tab";#Et tu affiches la nouvelle chaînes de caractère #Cela affiche :"Ecrire Des Histoires droles" <>;
Oui avec un remplacement:(^ marque le début de la chaîne, [^:] est une classe de caractères qui exclue les deux-points, * est un quantificateur qui signifie zéro ou plusieurs fois.)
Code : Sélectionner tout - Visualiser dans une fenêtre à part $txt =~ s/^[^:]*/Ecrire/;
ou en passant par split:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 my @tab = split(/:/, $txt, 2); # le 3e paramètre limite le nombre de résultats à 2 $txt = "Ecrire:" . $tab[1];
Franchement, un split pour quelque chose d'aussi simple à faire avec une expression régulière, c'est un peu de l'overkill.
- La programmation fonctionnelle en Perl : 1. Les opérateurs de liste; 2. Les fonctions d'ordre supérieur; 3. Étendre le langage.
- Comment utiliser des décorateurs en Perl: Un tutoriel pour changer le comportement d'une fonction sans en modifier le code source
- De Perl 5 à Perl 6 : 1. Les bases; 2. Les nouveautés; 3. Approfondissements; 4. Annexe 1: Ce qui change entre Perl 5 et Perl 6; Annexe 2: Les nouveautés de Perl 6.
- Les regex et grammaires de Perl 6
- Objets, classes et rôles en Perl 6 - Tutoriel de programmation orientée objet
- Tour d'horizon du nouveau langage Perl 6
Si ta chaîne est toujours "Lire:Des:Histoires:Droles"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 my $txt = 'Lire:des:Histoires:droles'; $txt =~ s/Lire/Ecrire/; print $txt;
De l'overkill non, car il n'y a pas de mise en œuvre d'un outil surpuissant ou disproportionné par rapport à la tâche à accomplir, moins straight forward (droit au but) peut être.
Ça peut paraître moins direct parce que moins concis (cela dit on peut l'écrire en une ligne) et parce que les étapes de l'opération sont plus apparentes, mais il ne doit pas y avoir une grande différence entre les deux (recherche, chaînes temporaires, concaténation, affectation du résultat => toutes ces étapes sont bien présentes lors d'une substitution mais la plupart sont masquées).
De plus, dans un contexte de champs séparés par un délimiteur (ici littéral donc trouvé très rapidement par un algorithme de recherche rapide, sans même utiliser la marche normal du moteur), utiliser split n'a rien d'incongru quand bien même le champ visé serait le premier.
À noter que dans tout autre langage que Perl qui fait la part belle au regex, les remarques auraient été plutôt dans l'autre sens (pourquoi sortir les regex quand on peut faire comme ci ou comme ça) avec plus ou moins de raison. Par exemple, si je devais faire la même chose en shell, mise à part l'utilisation du parameter expansion:$txt="Ecrire"${txt#*:} ou $txt=${txt/*([^:]):/Ecrire:} avec Bash qui reste la solution la plus concise, je ne sais pas sur quoi mon choix se serait porté entre cut (je ne sortirais probablement pas awk pour ça) et sed.
Jolie débat cependat j'ai l'impression qu'on perd de vue l'objectif principal qui est :
en lisant celà avec un esprit plus ou moins professionnel, habitué et avec du ecul on recherche à faire des choses dynamique qui sont en fonction de ceci, celà.
Cependant on perd de vu les cose les plus simple. Le problème que pose crow, est un problème qui se trouve dans le tuto perl ($v =~ s/voiture/pieds/; )
J'en déduit que du coup la solution la plus simple pour quelqu'un qui débute en perl serait donc
Mais Jolie débat
Code : Sélectionner tout - Visualiser dans une fenêtre à part $txt =~ s/Lire/Ecrire/;![]()
Je ne suis pas du même avis que toi, magicshark, et je rejoindrais CosmoKnacki. J'explique mes raisons :
- en général, le posteur "débutant" imagine des solutions locales à ses problèmes : ici, les regexp. Cependant il est très rare qu'il ait une vision plus globale de son problème (et notamment, étant débutant, il n'imagine pas toujours les différentes solutions possibles à son problème local). Dans le cas présent, le fait d'avoir une liste de champs séparés par un : (le séparateur), me laisse penser que dans le reste du traitement, on cherchera aussi à utiliser les autres champs (ce n'est pas sûr, mais c'est probable).
- la question soulevée ne semble pas générer de problème de performance (d'ailleurs, "a priori", on ne devrait jamais avoir à se préoccuper des performances, mais se préoccuper d'abord du fonctionnel, et de la maintenabilité).
Du coup, la solution du split (même à 2 paramètres), ne me parait pas du tout inappropriée, et elle est en tout cas
Bonjour,
Pas spécialement pour la perf, mais juste une autre vision pour faire la même chose:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 my $txt = 'Lire:des:Histoires:droles'; $txt = join ":","Ecrire",$txt =~ m/:(.*)/; print $txt;
Partager