in reply to 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:

package Example::Package; use strict; no strict 'refs'; use Data::Dumper; $Data::Dumper::Indent = 1; $Data::Dumper::Sortkeys = + 1; sub wuzzle { print "supz\n"; } my $symbol_table = *{"main::Example::Package::"}{HASH}; print "", Dumper($symbol_table), "\n"; $symbol_table->{wuzzle}->();

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?

Replies are listed 'Best First'.
Re^2: How can I find the names of dynamically created subroutines?
by blazar (Canon) on Feb 25, 2007 at 14:05 UTC
    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...

    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;
    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__
Re^2: How can I find the names of dynamically created subroutines?
by Cap'n Steve (Friar) on Feb 25, 2007 at 04:05 UTC
    Yes, Win32::OLE::Const exports a bunch of constant subroutines that look something like this: phKeyPNGInterlaceType. I was trying to get a list of possible ones because the only example of this I can find (in this node) only uses PNG format and doesn't deal with compression. It looks like your code worked though, so I'm off to dig through 600 lines of output. Thanks!