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

Reference non symbolique de fonction

8 réponses
Avatar
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

8 réponses

Avatar
Jean-Baptiste Mazon
Jogo writes:

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.

Avatar
Jogo
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.

Avatar
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->();
}

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.

Avatar
Jean-Baptiste Mazon
Nicolas George <nicolas$ writes:

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.


Avatar
Nicolas George
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.

Avatar
Jean-Baptiste Mazon
Nicolas George <nicolas$ writes:
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!

Avatar
Nicolas George
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.

Avatar
Emmanuel Florac
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.