Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

tri d'un tableau de tableaux

4 réponses
Avatar
gvdmoort
Bonjour =E0 tous,

Bon, je jure que j'ai fouill=E9 les FAQs, les archives de ce groupe et
d'autres joyeuset=E9s, mais je ne trouve pas la r=E9ponse au tri de
tableaux de tableaux d=E8s qu'on utilise les r=E9f=E9rences.

Prenons par ex. une structure construite =E0 partir d' /etc/passwd:

use Data::Dumper;
open PASSWD,"</etc/passwd";

my $users;
while (<PASSWD>) {
my $user =3D [ split(":",$_) ] ;
push @$users, $user;
}

print Dumper($users);

J'obtiens bien la structure attendue


$VAR1 =3D [
[
'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 =E0 rien

$sorted_users =3D sort {
$a->[4] <=3D> $b->[4]
} $users;

print Dumper($sorted_users);

$VAR1 =3D undef;

Quelle est la solution (et l'explication) ?

Merci d'avance,

Gauthier

4 réponses

Avatar
YBM
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);
Avatar
gvdmoort
On 16 mai, 18:56, YBM wrote:
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.
Avatar
Nicolas George
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.
Avatar
gvdmoort
On 16 mai, 20:52, Nicolas George <nicolas$ wrote:
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...