Script Perl pour compter une occurence dans une ligne avec mots

laisso -  
-
Bonjour,

J'ai des difficultés à exécuter ce script.

# Date 11/11/2014

#Demander à l'utilisateur de saisir autant de mots qu'il le souhaite. Il signale la fin de la saisie en entrant "@".
#Ensuite, la liste des mots qu'il a saisis est affichée dans l'ordre alphabétique avec le nombre d'occurrences de chaque mot dans la liste (un mot par ligne).


#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use Term::ANSIColor qw(:constants);
use List::Util qw(min max);
use List::Util qw(sum);
my $i=0;
my @L1;


print "saisissez autant de mots que vous le désirez: " ;
my $mots= <>;
chomp $mots;
say "vous avez saisi: $mots";

while ($mots !=@) {


$L1[$i]=$mots ;
$i++ ;
print "saisissez autant de mots que vous le désirez : " ;
$mots= <> ;
chomp $mots ;
say "vous avez saisi :$mots" ;

}

say(BOLD,RED,"> Terminé !",RESET) ;

foreach $line (@fcont) {
$compte =()= $line =~ /\s/g;
$compte++;
print FOUT $compte;
print FOUT "\n"
A voir également:

2 réponses


 
Salut laisso,

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
my
toutes 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
1

 
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 :

#!/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
1