Remplacer un mot dans un fichier - Perl - Programmation
Marsh Posté le 13-04-2013 à 18:06:05
Code : |
On lit le premier fichier et on met chaque ligne nettoyée des blancs de début et fin dans une liste
On lit le second fichier, pour chaque ligne, si on y trouve un élément de la liste, on fait le remplacement par ce qu'il faut.
A+,
Marsh Posté le 13-04-2013 à 18:29:03
Merci beaucoup pour votre réponse , j'ai essayé de tester le code mais il y a une erreur :
Bareword found where operator expected at E:\Mastère_2013\MesScripts\Concat.pl l
ine 27, near "s/ /-/r"
syntax error at E:\Mastère_2013\MesScripts\Concat.pl line 27, near "s/ /-/r"
Marsh Posté le 13-04-2013 à 18:47:20
Chez moi, ça marche
Donc soit vous avez fait une faute de frappe, soit vous n'avez pas une version à jour de perl.
A+,
Marsh Posté le 13-04-2013 à 18:51:01
peut etre a cause de la version en fait commet puis je mettre a jour ma version , ( chui sur windows )
Marsh Posté le 13-04-2013 à 18:54:19
Il suffit d'aller le chercher ici: http://www.activestate.com/activeperl/downloads
A+,
Marsh Posté le 13-04-2013 à 18:54:52
j'ai la version 5.6.1 , le module autodie n'est pas connu comment faire ?
Marsh Posté le 13-04-2013 à 18:56:32
J'ai fait et j'ai telecharger la version 5.16.3 mais le problème est que le fichier a installer .msi n'est pas reconnu par mon PC
Marsh Posté le 13-04-2013 à 19:33:21
?? Vous utilisez windows? l'extension.msi c'est celle des programmes utilisant l'installeur de microsoft, Microsoft Installer, donc c'est normalement reconnu en standard (a moins que vous soyez sur un système plus ancien que windows XP)
Vous étiez bien sur un compte avec les droits d'administration suffisants pour installer le programme?
A+,
Marsh Posté le 13-04-2013 à 19:35:09
nn , je suis sur windows 7 , et j'ai pas encore arriver à installer la version 5.16.3 je sais pas quoi faire
Marsh Posté le 13-04-2013 à 19:38:15
Windows 7, OK, mais êtes vous loggé avec un un compte avec les droits d'administration suffisants pour installer un programme?
Parce que le pb peut venir de la.
A+,
Marsh Posté le 13-04-2013 à 19:41:34
Ca devrait être sans pb alors. La je ne peux pas vous en dire plus, j'ai déjà installé une nouvelle version sur des machines avec Windows 7, et je n'ai eu aucun pb avec le fichier msi.
A+,
Marsh Posté le 13-04-2013 à 20:03:37
Vous pouvez essayer ceci:
Sur cette page http://www.sevenforums.com/tutoria [...] store.html
cliquez sur le lien msi pour récupérer le fichier Default_MSI.reg et suivez la procédure indiquée en tête de page (cliquez sur Default_MSI.reg et choisissez fusionner...)
A+,
Marsh Posté le 13-04-2013 à 20:26:12
Merci Gilou pour votre aide , en fait si vous me permettez je veux savoir comment fonctionne le code que tu m'a envoyé :
foreach (<$fh> ) ==> <$fh> signifi quoi ??
my $t = $r =~ s/ /-/r; ==> le r c quoi ??
if (/$r/) {
s/$r/$t/g;
print;
} ===> pour dire quoi ?
et finalement print quoi exactement
Merci d'avance
Marsh Posté le 13-04-2013 à 21:20:55
Citation : foreach (<$fh> ) ==> <$fh> signifi quoi ?? |
l'opérateur <> évalue le fichier associé au handle $fh et renvoie
- la ligne courante dans un contexte scalaire
- un tableau des lignes dans un contexte de liste
Citation : my $t = $r =~ s/ /-/r; ==> le r c quoi ?? |
s///r c'est une opération de substitution non-destructive: la ligne substituée est renvoyée (dans $t ici) , au lieu qu'on aie la substitution en place dans la ligne examinée ($r ici).
Citation : if (/$r/) { |
Je met les deux questions ensemble, car elles sont liées:
Quand je fais foreach (<$fh> ) la ligne lue est assignée à la variable locale implicite (et faite pour ça) $_ (sinon je ferais foreach my $line (<$fh> ), ou on assigne une variable explicite, $line)
Quand on fait le test if (/$r/), c'est sur la variable implicite $_ que porte le test (pour une variable explicite, on ferait if ($line =~ /$r/) )
Donc if (/$r/) teste si la ligne lue, $_ contient le pattern $r
si oui, s/$r/$t/g; remplace toutes (le /g) les occurences de $r par $t (qui est déduit de $r par substitution des blancs par des tirets). Idem, cette substitution s'applique a $_ (sinon on ferait $ligne =~ s/$r/$t/g;), bref, elle s'applique à la ligne lue
et print;, sans rien de plus, s'applique à $_ (sinon on ferait print $ligne;)
Tiens, je vois que d'ailleurs j'ai écrit mon code sans bien me relire (j'ai la crève et suis fiévreux)
Ce devrait être
Code :
|
On imprime la ligne après avoir effectué toutes les substitutions (mon code précédent l'imprimait à chaque substitution).
A+,
Marsh Posté le 13-04-2013 à 21:45:43
Par contre, il y a quelque chose d'ambigu dans ton énoncé:
Si tu as dans fichier 2
Irma mamanovitch est belle
Cela doit il être transformé en
Irma-mamanovitch est belle
Si oui, il n'y a pas à toucher au code, mais si non, alors
il faudra remplacer s/$r/$t/g; par s/\b$r\b/$t/g;
\b indique un début/fin de mot
A+,
Marsh Posté le 13-04-2013 à 23:08:02
merci beaucoup gilou , c'est très gentil , mais j'ai rencontré un autre problème , si j'ai dans mon fichier fich2 il ya une phrase qui ne contient pas un mot de mon fichier fich1 alors la phrase ne sera pas affiché dans le résultat , par exemple :
fich2 :
je veux vendre ma voiture
le garçon joue
et fich1 :
ma voiture
mon père
alors le resultat est :
je veux vendre ma-voiture ( ds ce cas le garçon joue ne sera pas afiiché)
comment résoudre ce problème?
merci d'avance
Marsh Posté le 13-04-2013 à 23:34:48
Vous ne voulez pas afficher les phrases qui ne sont pas modifiées, c'est ça?
Il suffit de positionner un indicateur quand une phrase est modifiée, et de conditionner l'affichage à la valeur de l'indicateur.
Code :
|
A+,
Marsh Posté le 14-04-2013 à 20:34:56
ReplyMarsh Posté le 14-04-2013 à 20:37:46
Bonsoir ,
MErci pour vos explications , merci pour votre patience , mon problème est résolu, je suis très reconnaissante
Marsh Posté le 14-04-2013 à 21:25:45
rim_enis a écrit : Non , par contre je veux afficher la phrase s'il n'est pas modifié |
C'est ce qu'il faisait. Et donc je comprenais pas pourquoi vous le demandiez explicitement, et j'ai pensé que vous demandiez autre chose.
A+,
Marsh Posté le 13-04-2013 à 17:00:31
je veux faire un script qui permet de :
Remplacer une suite des mots séparés par un espace mot qui se trouve dans fich1 ( par exemple ma voiture ) par la mme suite des mots mais séparé par - dans mon fichier fich 2 si cette suite des mots existe ds fich2 ...
Exemple : fich 1 contient :
ma voiture
mon père
ma maman
et fich 2 contient les phrases suivantes :
je veux voir mon père
je veux vendre ma voiture
ma maman est belle
======> le resultat sera donc :
je veux voir mon-père
je veux vendre ma-voiture
ma-maman est belle
je suis débutante en perl , j'ai essayé beaucoup des codes mais rien ne marche