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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
YBM
Le #22124701
gvdmoort a écrit :
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



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);

Mais si je veux effectuer un tri selon un champs, je n'arrive à rien

$sorted_users = sort {
$a->[4] <=> $b->[4]
} $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);
gvdmoort
Le #22124981
On 16 mai, 18:56, YBM
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 :



Un grand merci, ça devient plus clair à présent.
Nicolas George
Le #22125181
gvdmoort wrote in message
$a->[4] <=> $b->[4]



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.
gvdmoort
Le #22135591
On 16 mai, 20:52, Nicolas George
gvdmoort  wrote in message


>   $a->[4] <=> $b->[4]

Outre la réponse d'YBM, on ne saurait trop d'inviter à activer les wa rnings,
ç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...
Publicité
Poster une réponse
Anonyme