OVH Cloud OVH Cloud

nom du tableau avec var

3 réponses
Avatar
Fabrice L.
Bonjour,

@nom_Legumes = ('tomate','melon','salade');
@nom_Fruits = ('pomme','poire','scoubidou');

$var = param('var');

foreach $liste (@nom_$var) {

print $liste;

}

ca ne fonctionne pas .... ne peut on pas dynamiquement choisir le nom du
tableau ?
malgré qu'il me semble que si, je suppose donc que ma methode n'est pas la
bonne...

une nouvelle voie ???

MErci d'avance
Fabrice

3 réponses

Avatar
Klaus
Fabrice L. wrote:
@nom_Legumes = ('tomate','melon','salade');
@nom_Fruits = ('pomme','poire','scoubidou');

$var = param('var');

foreach $liste (@nom_$var) {

print $liste;

}

ca ne fonctionne pas .... ne peut on pas dynamiquement choisir le nom du
tableau ?


on peut, voir perlref, chapitre "références symboliques":
http://perl.enstimac.fr/DocFr/perlref.html#références%20symboliques

++++++++++++++++++++++++++++++++++++++++++++++++
++ [...] la valeur du scalaire est considérée comme le nom d'une
++ variable, plutôt que comme un lien direct vers une (éventuelle)
++ valeur anonyme. En général, les gens s'attendent à ce que ça
++ fonctionne de cette façon. C'est donc comme ça que ça
++ marche.
++
++ $name = "foo";
++ $$name = 1; # Affecte $foo
++ ${$name} = 2; # Affecte $foo
++ ${$name x 2} = 3; # Affecte $foofoo
++ $name->[0] = 4; # Affecte $foo[0]
++ @$name = (); # Efface @foo
++ &$name(); # Appelle &foo() (comme en Perl 4)
++ $pack = "THAT";
++ ${"${pack}::$name"} = 5; # Affecte $THAT::foo sans évaluation
++++++++++++++++++++++++++++++++++++++++++++++++

malgré qu'il me semble que si, je suppose donc que ma methode n'est pas la
bonne...


encore dans perlref, chapitre "références symboliques":
++++++++++++++++++++++++++++++++++++++++++++++++
++ [...] C'est très puissant, et potentiellement dangereux, dans le
++ sens où il est possible de vouloir (avec la plus grande
++ sincérité) utiliser une référence dure, et utiliser
++ accidentellement une référence symbolique à la place. [...]
++++++++++++++++++++++++++++++++++++++++++++++++

une nouvelle voie ???


Le conseil général dans ce cas est d'utiliser un simple "hash"
à la place, par exemple "%nom":
========================= ============
use strict;
use warnings;

my %nom;
$nom{Legumes} = ['tomate', 'melon', 'salade'];
$nom{Fruits} = ['pomme', 'poire', 'scoubidou'];

my $var = 'Legumes';

foreach my $liste (@{ $nom{$var} }) {
print $liste, "n";
}
========================= ============

Avatar
Fabrice L.
Le conseil général dans ce cas est d'utiliser un simple "hash"
à la place, par exemple "%nom":
==================================== use strict;
use warnings;

my %nom;
$nom{Legumes} = ['tomate', 'melon', 'salade'];
$nom{Fruits} = ['pomme', 'poire', 'scoubidou'];

my $var = 'Legumes';

foreach my $liste (@{ $nom{$var} }) {
print $liste, "n";
}

en meme temps que j'attendais une réponse, je cherchai dans cette voie,
merci de m'avoir economisé une nuit de recherche :)

a+

Fabrice
Avatar
Stef Stef
"Fabrice L." wrote:

une nouvelle voie ???


Je suis déjà tombé sur un truc du genre (j'ai remplacé param() par la
récupération d'un paramètre en ligne de commande) :

#! /usr/bin/perl

@nom_Legumes = ('tomate','melon','salade');
@nom_Fruits = ('pomme','poire','scoubidou');

$var = "nom_" . $ARGV[0];

foreach $liste (@{$var})
{
print $liste;
}

A l'exécution :
:~/perl$ ./var.pl Fruits
:~/perl$ ./var.pl Legumes
:~/perl$ ./var.pl toto
:~/perl$

Par contre, j'essaie d'éviter ce genre de pratique, car je trouve que
ça donne du code particulièrement difficile à maintenir.


Stéphane