Script Perl pour compter une occurence dans une ligne avec mots
Fermé
laisso
-
11 nov. 2014 à 18:27
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 17 nov. 2014 à 14:06
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 17 nov. 2014 à 14:06
A voir également:
- Script Perl pour compter une occurence dans une ligne avec mots
- Script vidéo youtube - Guide
- Aller à la ligne dans une cellule excel - Guide
- Partager photos en ligne - Guide
- Site de vente en ligne particulier - Guide
- Retrouver une musique avec un extrait en ligne - Guide
2 réponses
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié par [Dal] le 12/11/2014 à 14:34
Modifié par [Dal] le 12/11/2014 à 14:34
Salut laisso,
Oui, effectivement :
Tu dois faire
Tu dois déclarer avec
Il manque une accolade fermante à ta boucle foreach à la fin.
Cela dit :
- @fcont sort de nulle part, cela ne serait pas plutôt @L1 ?
- tu ne fais aucun tri alphabétique
- tu veux faire quoi exactement avec
Si j'étais toi, je mettrais les mots en tant que clefs d'un hash, dont la valeur serait la valeur numérique correspondant au nombre d'occurrences. Ensuite, tu tries ton hash selon les clefs avec foreach et sort, et tu affiches les clefs et leurs valeurs.
Dal
Oui, effectivement :
$ ./laisso.pl
syntax error at ./laisso.pl line 22, near "$i"
syntax error at ./laisso.pl line 28, near "}"
Global symbol "$line" requires explicit package name at ./laisso.pl line 32.
Global symbol "@fcont" requires explicit package name at ./laisso.pl line 32.
Global symbol "$compte" requires explicit package name at ./laisso.pl line 33.
Global symbol "$line" requires explicit package name at ./laisso.pl line 33.
Global symbol "$compte" requires explicit package name at ./laisso.pl line 34.
Global symbol "$compte" requires explicit package name at ./laisso.pl line 35.
Missing right curly or square bracket at ./laisso.pl line 36, at end of line
syntax error at ./laisso.pl line 36, at EOF
./laisso.pl has too many errors.
Tu dois faire
while ($mots !="@") {, puisque le symbole "@" est un caractère.
Tu dois déclarer avec
mytoutes les variables que tu utilises.
Il manque une accolade fermante à ta boucle foreach à la fin.
Cela dit :
- @fcont sort de nulle part, cela ne serait pas plutôt @L1 ?
- tu ne fais aucun tri alphabétique
- tu veux faire quoi exactement avec
$compte =()= $line =~ /\s/g;, en tout état de cause, cela cela n'affichera un décompte que pour chaque ligne du tableau
Si j'étais toi, je mettrais les mots en tant que clefs d'un hash, dont la valeur serait la valeur numérique correspondant au nombre d'occurrences. Ensuite, tu tries ton hash selon les clefs avec foreach et sort, et tu affiches les clefs et leurs valeurs.
Dal
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
Modifié par [Dal] le 13/11/2014 à 19:04
Modifié par [Dal] le 13/11/2014 à 19:04
Dans le monde réel, pour faire cela, on utiliserai un hash, c'est absurde de faire autrement en Perl.
et c'est aussi simple que cela :
ce qui donne :
Dal
et c'est aussi simple que cela :
#!/usr/bin/perl use strict; use warnings; my %hash; print "saisissez autant de lignes de mots séparés " . "par des espaces que vous le désirez (saisir " . "@ sur une ligne pour terminer) :\n" ; while ((my $mots = <>) ne "@\n") { chomp $mots; foreach my $mot (split /\s+/, $mots) { $hash{$mot}++; } } foreach my $mot (sort keys %hash) { print "Mot $mot :\t$hash{$mot} fois\n"; }
ce qui donne :
$ ./laisso_corr2.pl
saisissez autant de lignes de mots séparés par des espaces que vous le désirez (saisir @ sur une ligne pour terminer) :
il était un petit navire
il était un petit navire
qui n'avait ja ja jamais navigué
qui n'avait ja ja jamais navigué
ohé ohé
ohé ohé matelot
matelot navigue sur les flots
@
Mot flots : 1 fois
Mot il : 2 fois
Mot ja : 4 fois
Mot jamais : 2 fois
Mot les : 1 fois
Mot matelot : 2 fois
Mot n'avait : 2 fois
Mot navigue : 1 fois
Mot navigué : 2 fois
Mot navire : 2 fois
Mot ohé : 4 fois
Mot petit : 2 fois
Mot qui : 2 fois
Mot sur : 1 fois
Mot un : 2 fois
Mot était : 2 fois
Dal
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
14 nov. 2014 à 15:45
14 nov. 2014 à 15:45
Mais je croyais que tu disais ne pas pouvoir utiliser les hash parce qu'ils n'avaient pas été enseignés ?
N'oublie pas de me citer en tant qu'auteur de ce code, ainsi tu respecteras la licence CreativeCommons applicable : https://www.commentcamarche.net/infos/25861-informations-de-copyright/ et je te souhaite bonne chance :-)
Sinon, je te confirme de nouveau que ton code ne fonctionnait pas vraiment, en fin de compte. Essaye de lui passer les mêmes entrées que le mien, et tu verras le résultat.
Dal
N'oublie pas de me citer en tant qu'auteur de ce code, ainsi tu respecteras la licence CreativeCommons applicable : https://www.commentcamarche.net/infos/25861-informations-de-copyright/ et je te souhaite bonne chance :-)
Sinon, je te confirme de nouveau que ton code ne fonctionnait pas vraiment, en fin de compte. Essaye de lui passer les mêmes entrées que le mien, et tu verras le résultat.
Dal
[Dal]
Messages postés
6198
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
13 décembre 2024
1 096
17 nov. 2014 à 14:06
17 nov. 2014 à 14:06
ok, c'est super. Tu peux donc me citer sans crainte :-)
Modifié par [Dal] le 13/11/2014 à 14:34
Autrement, avec strict et warnings, tu as tous les messages d'erreur à la compilation, et à l'exécution, qui devraient permettre de te rendre compte que :
- est incorrect et que tu dois écrire ,
- utilise une variable $line non déclarée, donc tu dois écrire ,
- utilise un identifiant de fichier non ouvert, ni déclaré, pourquoi ne pas faire simplement ?
voilà le code corrigé
sur un exemple de saisies, cela donne cela :
c'est assez illisible, surtout si tu as beaucoup de mots différents, et tu n'affiches pas un mot par ligne avec le nombre de fois que ce mot apparaît.
pourquoi ne procèdes-tu pas comme suggéré dans mon message précédent avec un hash trié par clefs ?
Dal
13 nov. 2014 à 14:57
Modifié par [Dal] le 13/11/2014 à 18:56
En fait :
- ton code trie alphabétiquement chaque ligne et crée un tableau avec le résultat
- l'expression compte les espaces dans chaque ligne, et tu incrémentes de 1 le résultat, mais cela ne fait que compter les espaces (dans chaque ligne du tableau trié), et pas les occurrences des mots
Pour une solution avec un hash, voir mon nouveau post avec un exemple de code.
Dal