in reply to Re: How can I find the names of dynamically created subroutines?
in thread How can I find the names of dynamically created subroutines?

I'm not saying it's necessarily the best idea in the world, but you can in fact find that information (maybe) like this:

I'm not really sure it would be the best idea either. I mean: I don't know Win32::OLE::Const but I suppose it should have a means to list the constants it created. Whatever...

my $symbol_table = *{"main::Example::Package::"}{HASH};

(For sake of completeness) also:

my $symbol_table = \%Example::Package::;

or, in a more package-agnostic way:

my $symbol_table = \%{__PACKAGE__ . '::'};

(of course if it were not for the need to dumping it, one wouldn't probably take the reference at all.)

print "", Dumper($symbol_table), "\n";

One "problem" (hey, notice the quotes!) with this is that it will potentially report also entries which do not correspond to subs. Thus I would filter them out:

my %subs = %{__PACKAGE__ . '::'}; *{$_}{CODE} or delete $subs{$_} for keys %subs;

or

my %subs = map { $_ => *{$_}{CODE} } grep *{$_}{CODE}, keys %{__PACKAGE__ . '::'};

or

my %subs; while ( my ($k,$v)=each %{__PACKAGE__ . '::'} ) { $subs{$k}=$v if *{$v}{CODE}; }

Of course if the OP is only interested in the sub names, as is probable, then a simple grep would do:

my @subs = grep *{$_}{CODE}, keys %{__PACKAGE__ . '::'};
I'm surprised it isn't documented in the module Win32::OLE actually. I'm not at all familiar with these packages (linux fan), but does Win32::OLE::Const help somehow?

As hinted above, I second that. However if one, like the OP, wants to know which "constants" a certain module created, then it would sensible to only find the subs which were added upon its use, perhaps like thus:

package Example::Package; use strict; use warnings; use Data::Dumper; use constant foo => 1; BEGIN { no strict 'refs'; my %subs = map {$_ => 1} grep *{$_}{CODE}, keys %{__PACKAGE__ . '::'}; sub added_subs () { grep *{$_}{CODE} && !$subs{$_}, keys %{__PACKAGE__ . '::'}; } } use constant { bar => 2, baz => 3 }; print Dumper [added_subs]; __END__