http://qs321.pair.com?node_id=1230722


in reply to accessing stashes

You can do that with the symbol table, but using defined and exists is cleaner.
#!/usr/bin/perl use warnings; use strict; use feature qw{ say }; { package My; sub one { print "123"; } sub two; } say ${My::}{one}; # *My::one say ${My::}{two}; # -1 say ${My::}{three}; # say defined *My::one{CODE}; # 1 say defined *My::two{CODE}; # 1 say defined *My::three{CODE}; # say exists &My::one; # 1 say exists &My::two; # 1 say exists &My::three; # say defined &My::one; # 1 say defined &My::two; # say defined &My::three; #

Update: added the first paragraph of says.

Update 2: Interestingly, a forward declared sub with prototypes returns the prototypes with the first syntax:

sub four (&@); # ... say ${My::}{four}; # &@

Update 3: ... unless you add an attribute, too, which makes it output the glob name.

sub five (&@) :method; say ${My::}{five}; # *My::five

Update 4: The -1 is printed only if you remove all other mentions of My::three, otherwise *My::three is printed.

map{substr$_->[0],$_->[1]||0,1}[\*||{},3],[[]],[ref qr-1,-,-1],[{}],[sub{}^*ARGV,3]