|
|
|
|
Bonjour
Je dois faire un exo en Perl dans lequel je dois comparer le contenu d'un fichier avec le contenu d'un texte que j'ai tapé simplementsur la "Konsole"(je travaille avecWinows)...
Donc j'ai mis les mots du texte tapé dans un tableau (tout va bien) et puis il faut que je mette le contenu d'un fichier .txt (qui est un texte de Rousseau)...et là : probleme ! :
donc j'ai ouvert mon fichier avec la commande open...or die...
la ça va mais aps ca j'ai ecrit dans mon script :
while ($ligne=<$fic>) {
@tab_motsfic=split (" ",$ligne);
}
et là, la prof m'a dit que ça ne me prendrait que la derniere ligne du fichier pour la comparaison...
Pourriez vous m'aider svp ????
Merci
Configuration: Windows XP Internet Explorer 7.0
Salut,
#!/usr/bin/perl
# ici tu dois avoir autre chose vu que tu es sur windows
use warnings;use strict;
{
local $/; # mode slurp
my $fic = <>; # je capture le contenu de fichier dans $fic
print $fic; # j'affiche le contenu de $fic
}
__END__
pour exemple applique le code au script lui même
pour voir le résultat
lami20j |
Sinon pour mettre un fichier dans un tableau (je prends ton bout de code :-)) while ($ligne=<$fic>) {
push @tab_motsfic,$ligne;
} Ton prof t'a expliquer pourquoi
et là, la prof m'a dit que ça ne me prendrait que la derniere ligne du fichier pour la comparaison... quand tu fait @tab_motsfic=split (" ",$ligne); en fait à chaque passage ligne par ligne, le tableau est d'abord vidé de contenu et ensuite on lui affecte la ligne une par une jusqu'à la fin de fichier. Donc à la fin il ne gardera que la dernière. lami20j |
Alor voila l énoncé demon exo et ce k j'ai fait jusqu'à present...:
|
Comme tu ne l'as pas dit, j'ai suppose que ton fichier original contient un mot par ligne
mot fichier texte je insertion faire mettre perl programme table script ouvert mais bien pour la dernière ligne oui non trouver compteurChaque exécution de script sauvagarde le dernier fichier original (donc on peut toujours retourner un pas un arrière, mais pas 2 :-)) Le fichier sauvegardé aura le nom fichier_original.txt Voilà un exempleje vais taper la phrase (qui ne dit pas la verité :-)) Je ne suis pas bien les mot ne, suis et pas n'existe pas dans le fichier je vais repondre oui partout debian:~/trash# perl karinn.pl Saisissez un mot ou une phrase : je ne suis pas bien Le nombre de mots tapés est : 5 Le nombre de mots de fichier est : 22 Il y a 3 qui ne sont pas dans le ficher: ne suis pas Voulez-vous ajouter le mot ne au fichier? O[ui] ou N[on] : o Voulez-vous ajouter le mot suis au fichier? O[ui] ou N[on] : o Voulez-vous ajouter le mot pas au fichier? O[ui] ou N[on] : o debian:~/trash#Le résultat debian:~/trash# cat fichier.txt mot fichier texte je insertion faire mettre perl programme table script ouvert mais bien pour la dernière ligne oui non trouver compteur ne suis pasVoici le script (c'est totalement différent de ce que tu veux faire, en bref c'est plus perlien en comparaison avec ton code que s'approche de C par exemple :-)) j'aime bien le C :-)))) #!/usr/bin/perl
#
use warnings;use strict;
my (@mots_douteux,@fic);
my %dans_fichier;
my ($fichier,$temp) = ("fichier.txt", "temp.txt");
# ouverture de fichier en lecture
open F_LIRE, "$fichier"
or die "E/S: $!\n";
# ouverture de fichier temporaire en mode ajout
open F_ECRIRE, ">>$temp"
or die "E/S: $!\n";
# sauvagarde fichier dans un tableau
# en même temp je fait un chomp sur chaque element
map { chomp } @fic = <F_LIRE>;
# je sauvegarde le contenu de fichier original
print F_ECRIRE "$_\n" foreach @fic;
# début de programme
print "Saisissez un mot ou une phrase :\n";
chomp(my $texte = <STDIN>);
$texte =~ s/\W/ /g; # remplace signes punctuation avec un espace
my @mot_texte = split /\s+/, $texte; # pour split
# aide mémoire pour trouver les mots
# qui n'existent pas dans le fichier
@dans_fichier{@fic} = ();
# sauvegarde des mots inexistants dans le fichier
foreach (@mot_texte){
push @mots_douteux,$_ unless exists $dans_fichier{$_};
}
print "Le nombre de mots tapés est : ", @mot_texte+0,"\n";
print "Le nombre de mots de fichier est : ",@fic+0,"\n";
print "Il y a ",@mots_douteux+0," qui ne sont pas dans le ficher:\n";
print "@mots_douteux\n";
# traitment de mots trouvés
foreach (@mots_douteux){
print "Voulez-vous ajouter le mot $_ au fichier? O[ui] ou N[on] : ";
chomp(my $rep = <STDIN>);
print F_ECRIRE "$_\n" if $rep =~ /o(ui)?/i;
}
close F_LIRE;
close F_ECRIRE;
rename($fichier,"fichier_original.txt")
or die "E/S : $!";
rename ($temp,$fichier)
or die "E/S : $!\n";
lami20j |
Et si tu veux que le fichier soit trier par ordre alphabétique #!/usr/bin/perl
use warnings;use strict;
my (@mots_douteux,@fic);
my %dans_fichier;
my ($fichier,$temp) = ("fichier.txt", "temp.txt");
# ouverture de fichier en lecture
open F_LIRE, "$fichier"
or die "E/S: $!\n";
# ouverture de fichier temporaire en mode écriture
open F_ECRIRE, ">$temp"
or die "E/S: $!\n";
# sauvagarde fichier dans un tableau
# en même temp je fait un chomp sur chaque element
map { chomp } @fic = <F_LIRE>;
# début de programme
print "Saisissez un mot ou une phrase :\n";
chomp(my $texte = <STDIN>);
$texte =~ s/\W/ /g; # remplace signes punctuation avec un espace
my @mot_texte = split /\s+/, $texte; # pour split
# aide mémoire pour trouver les mots
# qui n'existent pas dans le fichier
@dans_fichier{@fic} = ();
# sauvegarde des mots inexistant dans le fichier
foreach (@mot_texte){
push @mots_douteux,$_ unless exists $dans_fichier{$_};
}
print "Le nombre de mots tapés est : ", @mot_texte+0,"\n";
print "Le nombre de mots de fichier est : ",@fic+0,"\n";
print "Il y a ",@mots_douteux+0," qui ne sont pas dans le ficher:\n";
print "@mots_douteux\n";
# traitment de mots trouvés
foreach (@mots_douteux){
print "Voulez-vous ajouter le mot $_ au fichier? O[ui] ou N[on] : ";
chomp(my $rep = <STDIN>);
push @fic,$_ if $rep =~ /o(ui)?/i;
}
# écriture dans le fichier temporaire
# et tri par ordre alphabétique
print F_ECRIRE "$_\n" foreach sort @fic;
close F_LIRE;
close F_ECRIRE;
# sauvegarde de fichier original
rename($fichier,"fichier_original.txt")
or die "E/S : $!";
# le nouveau fichier
rename ($temp,$fichier)
or die "E/S : $!\n";
lami20j |
Merci !!!...mais le probleme c'est qu'en cours on a vraiment pas vu ca du tout (map et d'autres syntaxes) lol.
|
c'est qu'en cours on a vraiment pas vu ca du tout (map et d'autres syntaxes) lol.
while ($ligne=<$fic>) { # pour chaque ligne de fichier
push (@tab_motsfic,$ligne); # ajoute au tableau l
} # j'ai supposé que chaque ligne c'est un seule mot
# sinon tu seras obligé de spliter
# chaque ligne, avant d'ajouter au tableau
# ici je ferme le bloc de while
# dorénavant j'utilise le tableau
# qui contient le fichier
foreach $elt2(@tab_motsfic) {
lami20j |
Ce que tu as dit en dernier à propos de la fonction push et avec le split je l'essaierai tout a l'heure...mais c'est vrai que c'est une bonne idée...donc si je comprends bien : je dois faire mon split avant de faire le push...(donc utiliser while...@tab_motsfic=split(" ",$ligne)...on est bien d'accord ? lol)
|
Re ! lol...
|
Re,
|
Tu vas sur http://cjoint.com/
|
Tu sais quoi ? j te mets le fichier direct comm ca...et tu le mettas dans le bloc notes....lol
|
Alors tu n'as pas compris.
|
Et dans mon profil lami20j tu ne vois pas mon e-mail?! lami20j |