Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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.
Jogo <jogo@matabio.net> 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.
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
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.
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 ;
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
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 wrote in message <fmsmywdcb6d.fsf@somewhere.net>:
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.
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
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.
Nicolas George <nicolas$george@salle-s.org> writes:
Jean-Baptiste Mazon wrote in message <fmsmywdcb6d.fsf@somewhere.net>:
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.
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
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 wrote in message <fmsy7fxarja.fsf@somewhere.net>:
my $stash = 'Foo::';
Ah, je n'avais pas pensé à mettre le :: dans le nom du symbole. Merci, je
note.