regex !!! [PERL] - Perl - Programmation
Marsh Posté le 10-06-2015 à 17:45:18
Déjà une astuce pour améliorer nettement la lisibilité: On peut utiliser un autre séparateur que '/' pour les regex, p.ex. s!ceci!cela!. Du coup on peut mettre des '/' directement sans devoir écrire "\/".
C'est peut-être pas élégant mais plus court et ça fonctionne. Par contre faut faire la liste des mots une fois pour le premier regex.
Code :
|
Ca sent la domotique...
Marsh Posté le 10-06-2015 à 17:59:24
Sans devoir faire la liste des mots, hautement expérimental!! (autrement dit à tester intensivement avant utilisation ou faire valider par un pro)
Code : |
(remplace le premier regex)
Marsh Posté le 10-06-2015 à 20:37:11
La routine replace reçoit une ligne et renvoie la ligne modifiée
Code :
|
- D'abord je met des / en début et fin de ligne (si ils sont inutiles, ils seront effacés plus tard)
- Je remplace les (...( et )...) par (...(/ et /)...)
- Je remplace les ou et et par / || / et / && /
- Je vire les trucs qui devraient pas y être en remplaçant /( et )/ par ( et )
A+,
Marsh Posté le 10-06-2015 à 22:19:24
Bonsoir,
Déjà merci à vous 2.
Je regarde ça en détail et je vous tiens au courant.
Gilou merci pour les explications à venir
Marsh Posté le 10-06-2015 à 22:40:48
Je viens de tester.
Gilou ça fonctionne parfaitement
Rat de combat, effectivement je triture ma domotique à la maison
Ta première solution fonctionne mais le script ne peut pas connaitre à l'avance le nom des capteurs. J'ai testé ta 2eme solution mais je me retrouve avec un / en trop au début et à la fin. Ceci dit chapeau quand même
Un grand merci pour votre aide.
Marsh Posté le 10-06-2015 à 22:47:32
On peut optimiser un peu le sub (ou en tout cas en réduire la verbosité) ainsi:
Code : |
A+,
Marsh Posté le 10-06-2015 à 23:02:50
Une petite note pour le rongeur guerrier:
rat de combat a écrit : Déjà une astuce pour améliorer nettement la lisibilité: On peut utiliser un autre séparateur que '/' pour les regex, p.ex. s!ceci!cela!. Du coup on peut mettre des '/' directement sans devoir écrire "\/".
|
Plutôt qu'un ENDT que tu lis de manière complexe, utiliser __DATA__ serait sans doute plus direct ici:
Code : |
A+,
Marsh Posté le 10-06-2015 à 23:31:59
Citation : J'ai testé ta 2eme solution mais je me retrouve avec un / en trop au début et à la fin. |
Je ne vois pas, où ça? Le résultat de mon script correspond à celui du script de gilou...?
Merci gilou pour le coup du __DATA__, je connaissais pas.
Citation : rongeur guerrier |
Marsh Posté le 11-06-2015 à 00:25:01
Excuse rat de combat c'est moi qui faisais une erreur
Ta solution est donc encore plus "concentrée"
Merci à vous.
Marsh Posté le 11-06-2015 à 11:08:55
Euh, dans la solution de Rat de combat, il y a ce probleme: Salon n'est pas reconnu parce qu'il commence par une majuscule (début de la 2e ligne).
Il faut remplacer la ligne
s!((?:salon|baie vitree|cuisine|chambre|entree) on)!/$1/!g;
par
s!((?:salon|baie vitree|cuisine|chambre|entree) on)!/$1/!gi;
avec un i (case independent) pour régler le problème.
Et il vaut mieux mettre des \s+ dans ce genre d'expression:
s!((?:salon|baie\s+vitree|cuisine|chambre|entree)\s+on)!/$1/!gi;
A+,
Marsh Posté le 11-06-2015 à 17:14:53
Merci Gilou, comme je ne connais pas le nom des capteurs il faut que j'utilise ta méthode ou la 2eme de rat de combat.
Je me permets de vous poser une autre question.
J'ai 2 tableaux, comment on peut les comparer ligne par ligne et trouver les lignes différentes (changement d'état).
Merci.
Marsh Posté le 11-06-2015 à 17:56:28
En utilisant le module Text::Diff, je pense.
A+,
Marsh Posté le 10-06-2015 à 14:31:30
Bonjour,
Je m'arrache les cheveux avec mon faible niveau en perl et les regex
Voila je lis un fichier qui contient par exemple les lignes suivante :
(salon on ou baie vitree on) et (cuisine on ou entree on)
Salon on et (entree on ou cuisine on) et baie vitree on
((salon on ou entree on) et (baie vitree on et cuisine on)) ou chambre on
et je veux transformer ces lignes en :
(/salon on/ || /baie vitree on/) && (/cuisine on/ || /entree on/)
/salon on/ && (/entree on/ || /cuisine on/) && /baie vitree on/
((/salon on/ || /entree on/) && (/baie vitree on/ && /cuisine on/)) || /chambre on/
j'ai écris le code suivant en supposant que $cond contient les lignes du fichier, lues une par une dans une boucle.
Je n’excuse par avance pour ce code de débutant, mais c'est compliqué et ça ne marche pas !!!!
Quelqu'un peut m'aider et me montrer le chemin à suivre ?
Par avance merci.
Message édité par web_olivier le 10-06-2015 à 14:39:36