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

tableau et nom dynamique

8 réponses
Avatar
mzi
Bonjour à tous,

J'ai fait le programme suivant:

my @arr = qw(a b c);
print $arr[0];

Jusque là, tout va bien (normal). Mais j'aimerais placer le nom du tableau
dans une variable:

my $name = "arr";

et accéder au contenu du tableau en me servant de la variable... Et là, je
bloque:

no strict "refs";
print ${"$name"}[0];

ne marche pas comme je le voudrais.

Merci pour toute aide,

--
mzi

8 réponses

Avatar
Paul Gaborit
À (at) Wed, 13 Jun 2007 10:15:48 +0200,
écrivait (wrote):
Bonjour à tous,

J'ai fait le programme suivant:

my @arr = qw(a b c);
print $arr[0];

Jusque là, tout va bien (normal). Mais j'aimerais placer le nom du tabl eau
dans une variable:

my $name = "arr";

et accéder au contenu du tableau en me servant de la variable... Et l à, je
bloque:

no strict "refs";
print ${"$name"}[0];

ne marche pas comme je le voudrais.


Les références par nom sont déconseillées pour plein de bonnes
raisons. La principale étant qu'elles ne sont (quasiment) jamais
nécessaires.

Ceci étant, si on les autorise, elles ne fonctionnent que sur les
variables globales et non sur les variables lexicales.


# my @arr = qw(a b c);
our @arr = qw(a b c);
print $arr[0];
my $name = "arr";
no strict "refs";
print ${"$name"}[0];

Là, ça marche car @arr n'est pas lexical.

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

Avatar
mzi
Paul Gaborit wrote:


Les références par nom sont déconseillées pour plein de bonnes
raisons. La principale étant qu'elles ne sont (quasiment) jamais
nécessaires.


Je pense que j'ai une bonne raison. Je veux créer des méthodes à la volée en
fonction des champs (fields) d'un objet utilisant Object::InsideOut. Les
méthodes créées à la volée doivent accéder aux champs (qui sont des
tableaux).


Ceci étant, si on les autorise, elles ne fonctionnent que sur les
variables globales et non sur les variables lexicales.


Merci.

Je ne suis pas certain de bien comprendre les implications de l'emploi
de "our" plutôt que "my". Je ne vais pas casser toute la hiérarchie des
paquetages si chacune de mes classes et ses sous classes ont des champs
déclarés avec "our"?

Merci d'avance pour tout complément d'information.

--
mzi

Avatar
mzi
Ceci étant, si on les autorise, elles ne fonctionnent que sur les
variables globales et non sur les variables lexicales.


Et le pire, c'est que la méthode que j'emploie
(Object::InsideOut::create_field) génère une variable lexicale...

Je vais réfléchir à tout ça.

--
mzi

Avatar
Paul Gaborit
À (at) Wed, 13 Jun 2007 13:48:26 +0200,
écrivait (wrote):
Paul Gaborit wrote:


Les références par nom sont déconseillées pour plein de bonnes
raisons. La principale étant qu'elles ne sont (quasiment) jamais
nécessaires.


Je pense que j'ai une bonne raison. Je veux créer des méthodes à la volée en
fonction des champs (fields) d'un objet utilisant Object::InsideOut. Les
méthodes créées à la volée doivent accéder aux champs (qui so nt des
tableaux).


Cette situation est tout à fait gérable sans utilisation des
références par nom.

De toutes manières, dès que l'on fait de l'objet, on n'utilise
quasiment jamais les variables globales. Il n'y a donc pas de
références par nom à utiliser.

Je ne suis pas certain de bien comprendre les implications de l'emploi
de "our" plutôt que "my". Je ne vais pas casser toute la hiérarchie d es
paquetages si chacune de mes classes et ses sous classes ont des champs
déclarés avec "our"?


Vos champs sont globaux à toute une classe (ce sont les mêmes pour
tous les objets de la classe) ? Si c'est cela alors on peut
effectivement utiliser une variable globale (au paquetage) pour chacun
de ces champs.

On peut aussi utiliser une seule variable globale. Par exemple, une
table de hachage avec une clé par champ (comme ça, on peut créer ou
supprimer des champs dynamiquement et ne pas utiliser de références
globales).

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


Avatar
mzi
Paul Gaborit wrote:

Je veux créer des méthodes à la volée
en fonction des champs (fields) d'un objet utilisant Object::InsideOut.
Les méthodes créées à la volée doivent accéder aux champs (qui sont des
tableaux).


Cette situation est tout à fait gérable sans utilisation des
références par nom.



Effectivement... je viens de trouver un moyen qui paraît adéquat pour mon
problème particulier, mais je ne suis pas certain que ce soit le plus
performant.

Merci pour les clarifications sur les variables globales.

--
mzi


Avatar
Paul Gaborit
À (at) Wed, 13 Jun 2007 13:58:11 +0200,
écrivait (wrote):

Ceci étant, si on les autorise, elles ne fonctionnent que sur les
variables globales et non sur les variables lexicales.


Et le pire, c'est que la méthode que j'emploie
(Object::InsideOut::create_field) génère une variable lexicale...


Peu importe la manière dont Object::InsideOut crée les champs. De
toutes manières, sauf manipulation très particulière, vous ne devriez
jamais y accèder par leur nom (à supposer qu'ils en aient un) mais par
un accesseur (qui porte habituellement le nom du champ). Et là, comme
c'est une méthode, on peut très bien utiliser le contenu d'une
variable comme nom de méthode (sans passer outre les limitations de
'use strict').

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


Avatar
Paul Gaborit
À (at) Wed, 13 Jun 2007 15:29:06 +0200,
écrivait (wrote):
Effectivement... je viens de trouver un moyen qui paraît adéquat pour mon
problème particulier, mais je ne suis pas certain que ce soit le plus
performant.


Heu... Mieux vaut un programme qui donne la solution lentement qu'un
programme qui plante rapidement. ;-)

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

Avatar
mzi
Paul Gaborit wrote:
Peu importe la manière dont Object::InsideOut crée les champs. De
toutes manières, sauf manipulation très particulière, vous ne devriez
jamais y accèder par leur nom (à supposer qu'ils en aient un) mais par
un accesseur



En fait, les méthodes générées sont des accesseurs particuliers.

--
mzi