http://qs1969.pair.com?node_id=1086122


in reply to List arguments of a method

I want to list the arguments of allVars that is - $no1, $no2, $name1 and $name2.

In the usual Perl nomenclature, the arguments are simply the values that are passed in, and those can be found in @_.

Perl 5 doesn't (yet) support formal parameter lists / signatures of subroutines, so you can't introspect them.

Perl 6 exposes signatures as objects, and allows you introspect that parameter list:

$ perl6-m -e 'sub f($x, $a, $b) { }; say &f.signature.params.perl' (Any $x, Any $a, Any $b).list $ perl6-m -e 'sub f($x, $a, $b) { }; say &f.signature.params[1].name' $a $ perl6-m -e 'sub f($x, $a, $b) { }; say &f.signature.params[1].type.^ +name' Any

Replies are listed 'Best First'.
Re^2: List arguments of a method
by tobyink (Canon) on May 15, 2014 at 09:27 UTC

    "Perl 6 exposes signatures as objects, and allows you introspect that parameter list"

    FYI, the Kavorka signature syntax and introspection API shown in my answer is very much inspired by Perl 6.

    Your example:

    $ perl6-m -e 'sub f($x, $a, $b) { }; say &f.signature.params[1].name' $a

    ... translates to:

    perl -MKavorka -E'fun f($x, $a, $b){ }; say Kavorka->info(\&f)->signat +ure->params->[1]->name'

    My policy was generally, "if in doubt, do things like Perl 6".

    I do really need to experiment with blessing coderefs, allowing things like: (\&f)->signature to "just work".

    use Moops; class Cow :rw { has name => (default => 'Ermintrude') }; say Cow->new->name