Rechercher : dans
Par :

[PERL] comparaison de chaines

Dernière réponse le 20 jun 2007 à 10:25:44 snowsurfer69, le 15 jun 2007 à 15:36:23 
 Signaler ce message aux modérateurs

Bonjour a tous!!

voila je voudrait comparer une 2 chaines
les 2 chaines sont récupérées a partir de 2 documents textes
voici un aperçu de mon code :

#!C:\\Perl\\bin\\perl

use strict;


open (IN, "test.txt") || die "Impossible d'ouvrir le fichier pour la cause suivante : $!\n";
my @tab = <IN>;
my$i = 0;

my $path = "U:\perl\dossier1/Dossier 21/tournoi pétanque 17juin 003.jpg = 66215";
foreach ($tab[$i] != $path)
{
print "$tab[$i]\n";
$i++;
}
close IN;

pour simplifier je compare avec une chaine non pas récupéreé mais entrée directement en dur dans la variable $path.


je suis censé récupérer une ligne dans un fichier puis la comparer avec toutes les lignes d'un autre fichier.

voila a quoi ressemblent mes fichiers :

U:\perl\dossier1/Dossier 21/Thumbs.db = 17408
U:\perl\dossier1/Dossier 21/tournoi pétanque 17juin 001.jpg = 36592
U:\perl\dossier1/Dossier 21/tournoi pétanque 17juin 003.jpg = 66215
U:\perl\dossier1/Dossier 21/tournoi pétanque 17juin 005.jpg = 46314
U:\perl\dossier1/Dossier 21/tournoi pétanque 17juin 007.jpg = 48875
U:\perl\dossier1/Dossier 22/Didier.zip = 269679061
U:\perl\dossier1/Dossier 22/Dossier 31/Thumbs.db = 14848
U:\perl\dossier1/Dossier 22/Dossier 31/tournoi pétanque 17juin 002.jpg = 50077
U:\perl\dossier1/Dossier 22/Dossier 31/tournoi pétanque 17juin 006.jpg = 45269


il contiennent une liste de l'arborescence de certains documents.
le but final du programme étant de répertorier les fichiers supprimés et donc les lignes du fichier n'existant plus.

ce code me parait pourtant simple mais je n'arrive pas a le faire fonctionner.... debutant oblige!!

si quelqu'un pouvait m'aider je lui en serait fort reconnaissant!!
sur ce merci bcp!!

Configuration: Windows XP
Internet Explorer 6.0

Meilleures réponses pour « [PERL] comparaison de chaines » dans :
Les guillemets, apostrophes et les chaînes VoirComment jouer avec les guillemets et les apostrophes dans les chaînes 1. Préambule 2. Éviter une coupure dans la chaîne 3. Ajouter un guillemet dans la chaîne 3.1 Avec l'apostrophe 3.2 Avec l'ASCII 3.3 Directement 3.3.1 Méthode...
Supprimer les accents avec PHP VoirPour un tas de raisons, il est parfois utile de convertir un texte accentué en un texte sans accents. Voici une fonction permettant de transformer très simplement la quasi-totalité des accents en leur équivalent non-accentués : function...
Connecter le PC à la chaîne hifi sans fil VoirVotre PC est dans le bureau et votre chaîne hifi dans le salon et vous souhaiteriez profiter du son de votre installation hifi pour écouter vos MP3 stockés sur l'ordinateur ? Cette fiche a pour objectif de recenser les différentes possibilités de...
PHP - Expressions régulières VoirQu'est-ce qu'une expression régulière? Les expressions régulières sont des modèles créés à l'aide de caractères ASCII permettant de manipuler des chaînes de caractères, c'est-à-dire permettant de trouver les portions de la chaîne correspondant au...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Perl - les opérateurs VoirQu'est-ce qu'un opérateur? Les opérateurs sont des symboles qui permettent de manipuler des variables, c'est-à-dire effectuer des opérations, les évaluer, ... On distingue plusieurs types d'opérateurs : les opérateurs de calcul les...

1

lami20j, le 15 jun 2007 à 16:34:52

Salut,

essaie comme ça

#!C:\\Perl\\bin\\perl 
use strict; use warnings;

open IN, "test.txt" or die "E/S : $!\n"; 


my $path = 'U:\perl\dossier1/Dossier 21/tournoi pétanque 17juin 003.jpg = 66215'; 

print grep { /^$path$/ } <IN>;
close IN; 
--
lami20j

Répondre à lami20j

2

snowsurfer69, le 18 jun 2007 à 09:49:14

Salut!

Lorsque j'execute ton code il ne se passe rien!

je l'ai un peu modifié :

"print grep ( $path , <IN>);"
au lieu de :
"print grep { /^$path$/ } <IN>;"

et cela m'affiche alors tout le contenu de mon fichier texte;

1-Quelle est la différence entre ces 2 écriture : '$path' et '/^$path$/'.
2-Finalement comment faire pour tester le présence de ma chaine '$path' dans mon fichier?

Répondre à snowsurfer69

3

lami20j, le 18 jun 2007 à 11:03:27

Salut,

mets ton fichier sur cjoint pour le tester
si je t'ai donné la commande c'est parce que ça marche dans l'environnement que je l'ai testé
je vais t'expliqué après
lami20j

Répondre à lami20j

4

snowsurfer69, le 18 jun 2007 à 11:28:25

Voila mon fichier texte :

http://cjoint.com/?gslz6AXODO

Répondre à snowsurfer69

5

lami20j, le 18 jun 2007 à 11:57:27

Je vais voir ce soir, mais tu peux déjà teste avec ça

print grep { /^$path/ } <IN>;
ou
print grep { /$path/ } <IN>;

mais en aucun cas comme tu l'as fait
print grep ( $path , <IN>);

Il ne faut pas exces avec les paranthèses :-))
il faut voir la fonction grep de Perl pour comprendre lami20j

Répondre à lami20j

6

snowsurfer69, le 20 jun 2007 à 09:19:11

Salut!

Finalement j'ai eu recours a une technique différente pour parcourir mes chaines :


############################################################­#
our $presence = 0;
print "Fonction compare \n";

chomp($path); #retire le dernier caractère de la chaine; ici le "\n"; pour permettre la comparaison de chaines.
for ($i=0 ; $i <= $#tab ; $i++)
{
chomp(@tab[$i]);#retire le dernier caractère de la chaine; ici le "\n"; pour permettre la comparaison de chaines.

if ($path eq @tab[$i])
{
$presence = 1;
}

#seek (COMP,0,0); # retour au debut du fichier.
}
$path = $path."\n"; # on remet le dernier caraéctère de fin de chaine pour une ecriture ulterieure dans le fichier plus lisible
return $presence; # On retourne la valeur de resultat du test.
#############################################################

voila certainement plus barbare que "grep" mais cela fonctionne et au moins ... je comprend comment lol!!!

mais merci beaucoup a Lami20j pour son aide

a+

Répondre à snowsurfer69

7

 lami20j, le 20 jun 2007 à 10:25:44

Salut,

je n'ai pas repondu puisqu'il y a une chose que je n'ai pas compris (en bref sous win ne fonctionne pas - je vais voir plus tard pourquoi)

le plus important c'est que as obtenu ce que tu veux

En revanche si tu veux tu peux tester ce code

chomp @tab;
foreach(@tab){
  $presence = 1 if $path eq $_;
}
qui remplace celui là

for ($i=0 ; $i <= $#tab ; $i++)
{
chomp(@tab[$i]);

if ($path eq @tab[$i])
{
$presence = 1;
}


En bref si tu peux faire chomp directement sur le tableau sans avoir besoi de faire une boucle

aussi celui là

foreach(chomp @tab){
  $presence = 1 if $path eq $_;
}

lami20j

Répondre à lami20j
Collection CommentÇaMarche.net