OVH Cloud OVH Cloud

question basique sur les listes

4 réponses
Avatar
Julien Favre
bonjour,
je découvre perl et je me pose des questions sur les listes.
je cherche à stocker une liste dans une variable et l'exploiter plus
tard mais j'ai un soucis :-(


my $ch1 = "azer";
my $ch2 = "ty";

my $tab = ($ch1, $ch2);

#
# some stuff
#
my $ch3;
my $ch4;
($ch3, $ch4) = $tab;
printf "%s %s\n", $ch3, $ch4;

4 réponses

Avatar
Paul Gaborit
À (at) Wed, 26 Jul 2006 09:47:54 +0200,
Julien Favre écrivait (wrote):
je découvre perl et je me pose des questions sur les listes.
je cherche à stocker une liste dans une variable et l'exploiter plus
tard mais j'ai un soucis :-(

my $ch1 = "azer";
my $ch2 = "ty";

my $tab = ($ch1, $ch2);

#
# some stuff
#
my $ch3;
my $ch4;
($ch3, $ch4) = $tab;
printf "%s %sn", $ch3, $ch4;


$ - c'est pour une variable scalaire (une seule valeur qui peut
éventuellement être une référence à quelque chose d'autre).

@ - c'est pour les tableaux.

Donc, soit vous utilisez directement un tableau :

my @tab = ($ch1, $ch2);
my ($ch3, $ch4) = @tab;

soit vous utilisez une référence (ici à un tableau) :

my $tab = [$ch1, $ch2];
my ($ch3, $ch4) = @{$tab};

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Julien Favre
À (at) Wed, 26 Jul 2006 09:47:54 +0200,
Julien Favre écrivait (wrote):
je découvre perl et je me pose des questions sur les listes.
je cherche à stocker une liste dans une variable et l'exploiter plus
tard mais j'ai un soucis :-(

my $ch1 = "azer";
my $ch2 = "ty";

my $tab = ($ch1, $ch2);

#
# some stuff
#
my $ch3;
my $ch4;
($ch3, $ch4) = $tab;
printf "%s %sn", $ch3, $ch4;


$ - c'est pour une variable scalaire (une seule valeur qui peut
éventuellement être une référence à quelque chose d'autre).

@ - c'est pour les tableaux.

Donc, soit vous utilisez directement un tableau :

my @tab = ($ch1, $ch2);
my ($ch3, $ch4) = @tab;

soit vous utilisez une référence (ici à un tableau) :

my $tab = [$ch1, $ch2];
my ($ch3, $ch4) = @{$tab};



merci de cette réponse.
j'avais un peu trop simplifié mon exemple car en fait, je voulais mettre
mon résultat dans un tableau:

use vars qw(@tab);
my $ch1 = "azer";
my $ch2 = "ty";
my $idx = 0;

@tab[$idx] = ($ch1, $ch2);

#
# some stuff
#
my $ch3;
my $ch4;
($ch3, $ch4) = @tab[$idx];
printf "%s %sn", $ch3, $ch4;


Avatar
Paul Gaborit
À (at) Wed, 26 Jul 2006 11:09:58 +0200,
Julien Favre écrivait (wrote):
j'avais un peu trop simplifié mon exemple car en fait, je voulais
mettre mon résultat dans un tableau:

use vars qw(@tab);
my $ch1 = "azer";
my $ch2 = "ty";
my $idx = 0;

@tab[$idx] = ($ch1, $ch2);
#
# some stuff
#
my $ch3;
my $ch4;
($ch3, $ch4) = @tab[$idx];
printf "%s %sn", $ch3, $ch4;


@tab[$idx] signifie la liste d'éléments (à cause du @) pris dans le
tableau 'tab' (à cause du tab[...]) et identifiés par les indices
fournis entre les crochets. Ici, vous ne donnez qu'un seul
indice. Donc cette liste d'éléments ne contient qu'un seul élément
($tab[$idx]).

Vous pourriez utiliser deux éléments de votre tableau @tab :

@tab[$idx, $idx+1] = ($ch1, $ch2);
my ($ch3, $ch4) = @tab[$idx, $idx+1];

Mais je ne suis pas sûr que c'est ce que vous cherchez à faire.

Vous pouvez aussi utiliser l'élement $idx de votre tableau @tab pour
stocker une référence à un tableau de valeur (le tableau référéncé
sera un tableau anonyme).

On peut alors faire :

$tab[$idx] = [$ch1, $ch2]; # les crochets servent à créer une
# référence à un tableau anonyme
my ($ch3, $ch4) = @{$tab[$idx]}; # @{...} permet de déréférencer...

Ou alors :

@{$tab[$idx]} = ($ch1, $ch2);
my ($ch3, $ch4) = @{$tab[$idx]};

De manière générale, il faut retenir qu'on utilise '$' pour parler
d'une seule valeur scalaire et '@' pour parler d'une liste de valeurs.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Julien Favre

On peut alors faire :

$tab[$idx] = [$ch1, $ch2]; # les crochets servent à créer une
# référence à un tableau anonyme
my ($ch3, $ch4) = @{$tab[$idx]}; # @{...} permet de déréférencer...


exactement. ça marche parfaitement :-)
merci beaucoup,