tri d'un tableau de tableaux
Le
gvdmoort
Bonjour à tous,
Bon, je jure que j'ai fouillé les FAQs, les archives de ce groupe et
d'autres joyeusetés, mais je ne trouve pas la réponse au tri de
tableaux de tableaux dès qu'on utilise les références.
Prenons par ex. une structure construite à partir d' /etc/passwd:
use Data::Dumper;
open PASSWD,"</etc/passwd";
my $users;
while (<PASSWD>) {
my $user = [ split(":",$_) ] ;
push @$users, $user;
}
print Dumper($users);
J'obtiens bien la structure attendue
$VAR1 = [
[
'root',
'x',
'0',
'0',
'root',
'/root',
'/bin/bash
'
],
[
'daemon',
'x',
'1',
'1',
'daemon',
'/usr/sbin',
'/bin/sh
'
],
(etc.)
Mais si je veux effectuer un tri selon un champs, je n'arrive à rien
$sorted_users = sort {
$a->[4] <=> $b->[4]
} $users;
print Dumper($sorted_users);
$VAR1 = undef;
Quelle est la solution (et l'explication) ?
Merci d'avance,
Gauthier
Bon, je jure que j'ai fouillé les FAQs, les archives de ce groupe et
d'autres joyeusetés, mais je ne trouve pas la réponse au tri de
tableaux de tableaux dès qu'on utilise les références.
Prenons par ex. une structure construite à partir d' /etc/passwd:
use Data::Dumper;
open PASSWD,"</etc/passwd";
my $users;
while (<PASSWD>) {
my $user = [ split(":",$_) ] ;
push @$users, $user;
}
print Dumper($users);
J'obtiens bien la structure attendue
$VAR1 = [
[
'root',
'x',
'0',
'0',
'root',
'/root',
'/bin/bash
'
],
[
'daemon',
'x',
'1',
'1',
'daemon',
'/usr/sbin',
'/bin/sh
'
],
(etc.)
Mais si je veux effectuer un tri selon un champs, je n'arrive à rien
$sorted_users = sort {
$a->[4] <=> $b->[4]
} $users;
print Dumper($sorted_users);
$VAR1 = undef;
Quelle est la solution (et l'explication) ?
Merci d'avance,
Gauthier

Poser une question


Bien, mais pourquoi manipuler une référence de tableau et non un
tableau directement ? Ceci me semble plus naturel :
my @users;
while (<PASSWD>) {
my $user = [ split(":",$_) ] ;
push @users, $user;
}
@sorted_users = sort {
$a->[4] <=> $b->[4]
} @users;
print Dumper(@sorted_users);
Normal, sort attend une liste et tu ne lui passe qu'une liste à un
élément qui est la référence. Il faut déréférencer cette référence.
De plus sort renvoie un tableau, pas une référence :
@sorted_users = sort {
$a->[4] <=> $b->[4]
} @{$users};
print Dumper(@sorted_users);
Un grand merci, ça devient plus clair à présent.
Outre la réponse d'YBM, on ne saurait trop d'inviter à activer les warnings,
ça te permettrait de te rendre compte que tu utilises une comparaison
numérique pour un champ texte.
...Je le f'rai plus, m'sieu...