Reference non symbolique de fonction

Le
Jogo
Bonjour,

Je lis un nom de module et un nom de fonction dans un fichier et je
voudrais avoir une référence à la fonction correspondante.

Je peux faire :

my $flu = $mod."::".$func ;
my $ref = &$flu ;

ou bien :

my $flu = $mod."::" ;
my $ref = $$flu{$func} ;

Mais dans les 2 cas j'utilise des références symboliques, et du coup pas
de use strict

Quelqu'un a-t-il une solution ?

--
I don't drink, I don't like it, it makes me feel too good.
-- K. Coates
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
Jean-Baptiste Mazon
Le #149536
Jogo
Je lis un nom de module et un nom de fonction dans un fichier et je
voudrais avoir une référence à la fonction correspondante.


Qu'est-ce qu'une rérérence symbolique?

À mon sens, c'est une chaine de caractères utilisée en lieu et place
d'un symbole ou identifieur, e.g.:

my $var = 42;
${"var"}++;

Avec une hypothèse pareille, il me parait strictement(*) impossible
d'obtenir une référence à une fonction à partir d'un fichier
extérieur(**).

(*) c'est à dire sans "eval"
(**) lu en tant que fichier et non en tant que programme

Mais dans les 2 cas j'utilise des références symboliques, et du coup pas
de use strict...

Quelqu'un a-t-il une solution ?


Il en existe plein, mais à mon sens ce sont les hypothèses qui sont à
revoir. Si les références symboliques sont à éviter, ce n'est pas
pour les beaux yeux de strict.pm, mais bel et bien parce qu'elles
ouvrent la voie à toutes les horreurs possibles et imaginables.

Jogo
Le #149535
Argh ! Ça doit être la chaleur qui me ramoli le cerveau...

Mais dans les 2 cas j'utilise des références symboliques, et du coup
pas de use strict...


Il suffit bien sûr d'utiliser eval :
my $ref = eval "\&".$mod."::".$func ;

--
Hodie natus est radici frater.

Nicolas George
Le #149534
Jean-Baptiste Mazon wrote in message
Avec une hypothèse pareille, il me parait strictement(*) impossible
d'obtenir une référence à une fonction à partir d'un fichier
extérieur(**).


Tu te trompes en partie. Tu peux essayer le code suivant :

use strict;
sub Foo::bar { print "Je suis bar.n" }
sub Foo::qux { print "Je suis qux.n" }
for my $i ("bar", "qux") {
my $f = *{$Foo::{$i}}{CODE};
$f->();
}

Je n'ai pas trouvé la bonne syntaxe pour pouvoir sélectionner le package de
la même manière, mais ça doit être possible.

Jean-Baptiste Mazon
Le #149432
Nicolas George
Jean-Baptiste Mazon wrote in message
Avec une hypothèse pareille, il me parait strictement(*) impossible
d'obtenir une référence à une fonction à partir d'un fichier
extérieur(**).


Tu te trompes en partie. Tu peux essayer le code suivant :

use strict;
sub Foo::bar { print "Je suis bar.n" }
sub Foo::qux { print "Je suis qux.n" }
for my $i ("bar", "qux") {
my $f = *{$Foo::{$i}}{CODE};
$f->();
}


(joli coup ;-)

Passer par la table des symboles est effectivement bon pour "use
strict", mais le coeur y est pour ce qui est de la référence
symbolique.

Je n'ai pas trouvé la bonne syntaxe pour pouvoir sélectionner le package de
la même manière, mais ça doit être possible.


Il y a un exemple dans perlref, mais en symbolique.
Sinon, on peut toujours se lancer dans de nouvelles horreurs:

sub Foo::bar { 42 }
my $stash = 'Foo::';
my $symbol = 'bar';
print $::{$stash}{$symbol} -> ();

Garanti strict, et j'en ai honte. :-)

Si la demande initiale est vraiment fondée, c'est intrinsèquement un
référencement symbolique. S'il est inévitable, il vaut mieux
l'assumer et l'autoriser localement que le contourner et se retrouver
avec du code illisible.


Nicolas George
Le #149431
Jean-Baptiste Mazon wrote in message
my $stash = 'Foo::';


Ah, je n'avais pas pensé à mettre le :: dans le nom du symbole. Merci, je
note.

Jean-Baptiste Mazon
Le #149430
Nicolas George
Ah, je n'avais pas pensé à mettre le :: dans le nom du symbole. Merci, je
note.


Mais de rien. :-)

Euh, non... je veux dire... NE NOTE RIEN! Cette pratique est
injustifiable pour 99.9% des cas de bon développement!

Nicolas George
Le #149429
Jean-Baptiste Mazon wrote in message
Euh, non... je veux dire... NE NOTE RIEN! Cette pratique est
injustifiable pour 99.9% des cas de bon développement!


Je sais, mais le jour où je suis dans les 0.1% restants, je veux savoir le
faire.

Emmanuel Florac
Le #149428
Le Mon, 27 Aug 2007 15:50:47 +0200, Jogo a écrit :


Mais dans les 2 cas j'utilise des références symboliques, et du coup pas
de use strict...

Quelqu'un a-t-il une solution ?


Utiliser des références normales :

my %func = { foo => &foo, bar => &bar};

my $var="foo";

$func{$var}->();


--
Three may keep a secret, if two of them are dead.
Benjamin Franklin.

Publicité
Poster une réponse
Anonyme