Bonjour,
Je cherche comment faire un tri par valeur dans une table de hachage. Dans le script ci-dessous, le tri par valeur ne fonctionne pas. Le but recherché est de trier par valeur et par ordre décroissant, afin de limiter l'affichage aux dix nombres les plus importants.
Merci d'avance.
#!/usr/bin/perl
use strict;
use warnings;
use Text::Iconv;
my $converter = Text::Iconv->new("ISO-8859-1", " UTF-8");
my ($sec, $min, $heure, $jour, $mois,$annee, undef, undef, undef) = localtime();
$annee += 1900;
my (@tmp,%fields,$event,$trouve,$sujet,$k,$nombre,%stat);
my $annee_mois='*'.$annee.$mois.'*'; # récupération du critère année et mois
my $motif="SIMPLE";
chdir('/user/stats') || die ("Erreur chdir \n");
open RES,">/var/www/cgi-bin/data/top_ten.txt" or die "E/S : $!\n";
chomp(my @logs = glob($annee_mois));
foreach my $e(@logs){
open FILE,"$e" or warn "E/S : $!\n";
while (<FILE>){
chomp;
if ($_=~ /$motif/){
$_ =~s/[\[\]]/\|/g;
@tmp=split(/\|/,$_);
$event=$tmp[0];
$trouve=$tmp[4];
$sujet=lc($tmp[6]);
$sujet= $converter->convert($sujet);
$sujet=~ s/[\?éèêë]/e/g;
$sujet=~ s/[\%\"]//g;
$sujet=~ s/\b(des|du|de|d' ?|le|la|les|l' ?)//g;#mots vides
$sujet=~ s/(\s+|\t)/ /g;# remplace trop d'espace par un seul espace
$sujet=~ s/^\s+|\s+$//g; #suppression des espaces (debut et fin)
unless ($trouve==0){
$_=join (",",$event,$sujet) if $sujet ne "";
push @{$fields{$sujet}},$event;
}
}
}
}
# comptage de nombre de sujet identique
foreach $sujet (sort keys %fields) {
$nombre = 0;
@tmp = @{$fields{$sujet}};
foreach $event (@tmp) {
$nombre++;
}
push @{$stat{$sujet}},$nombre;
}
# tri par valeur et enregisterment dans le fichier de sortie
foreach $k (sort {$stat{$b} cmp $stat{$a}} keys %stat){
print RES "$k", map {",$_"} @{$stat{$k}},"\n";
}
______________________________FIN
Configuration: Linux Fedora
Firefox 2.0.0.18