5 votes

Comment obtenir la signature d'un sous-programme en cours d'exécution ?

Perl fournit une API via CORE::prototype qui vous permet d'obtenir un prototype. Ceci est documenté plus en détail par Sub::Util qui est la méthode documentée pour travailler avec les subs,

Sub::Util::prototype ,

Renvoie le prototype de l'élément $code s'il en a une, sous la forme d'une chaîne de caractères. C'est la même chose que la fonction CORE::prototype Il est inclus ici simplement pour des raisons de symétrie et d'exhaustivité par rapport aux autres fonctions.

Cependant, je ne vois nulle part comment obtenir la signatures en cours d'exécution ? Est-ce que perl met cela à disposition ?

5voto

mob Points 61524

C'est très ... indirect, mais il faut séparer le sous et analyser le code de la signature.

sub foo ($bar) { return 0 }

use B::Deparse;
$foo = B::Deparse->new->coderef2text(\&foo);

# contents of foo:
# BEGIN {${^WARNING_BITS} = "\x10\x01\x00\x00\x00\x50\x04\x00\x00\x00\x00\x00\x00\x55\x50\x55\x50\x51\x01"}
# use feature 'signatures';
# die sprintf("Too many arguments for subroutine at %s line %d.\n", (caller)[1, 2]) unless @_ <= 1;
# die sprintf("Too few arguments for subroutine at %s line %d.\n", (caller)[1, 2]) unless @_ >= 1;
# my $bar = $_[0];
# return 0;

@foo = split /\n/, $foo;
if ($foo[2] =~ /use feature 'signatures'/ &&
        $foo[3] =~ /Too many arguments/ &&
        $foo[4] =~ /Too few arguments/) {
    @sig = ();
    $n = 5;
    do {
        ($sig) = $foo[$n] =~ /my (\W\w+) = /;
        push @sig,$sig if $sig;
        $n++;
    } while ($sig);
    print "Signature is (", join(",",@sig), ")\n";
}

2voto

Leon Timmermans Points 23230

Ce n'est pas possible actuellement, pour la même raison que l'analyse traditionnelle des arguments ( my ($foo, $bar) = @_; ) ne l'est pas : il est interne au sous-programme.

Il a déjà été suggéré d'ajouter une telle chose, mais pour l'instant, cela ne semble pas probable.

-1voto

Evan Carroll Points 13420

De irc.freenode.net/#perl,

15:03 < Grinnz> there's no perl level api for that

C'est à peu près un démiboss perl. Il m'a indiqué ce travail à partir de Nov 2019 qui ouvre la voie à l'"API d'introspection de la signature".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X