Cap'n Steve has asked for the wisdom of the Perl Monks concerning the following question:

I'm trying to control Photoshop with Win32::OLE, but information is very lacking. My only idea is to try and find out what constants Win32::OLE::Const creates and figure it out from there. How would I go about listing all the subroutines in the current namespace?
  • Comment on How can I find the names of dynamically created subroutines?

Replies are listed 'Best First'.
Re: How can I find the names of dynamically created subroutines?
by jettero (Monsignor) on Feb 25, 2007 at 02:08 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 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?

      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__
      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!
Re: How can I find the names of dynamically created subroutines?
by polypompholyx (Chaplain) on Feb 25, 2007 at 20:39 UTC
    Rather than importing all those constant subs and peeking at the symbol table, you could import the constants into a conventional hash instead:
    use Win32::OLE::Const; my $ps = Win32::OLE::Const->Load( 'Adobe Photoshop' ); for my $key ( keys %{ $ps } ) { print "$key => $ps->{ $key }\n"; }
      Well I guess that would be easier. I didn't even notice that before, but I think I'll switch to using that so I don't have to do "no strict 'subs';" anymore.
Re: How can I find the names of dynamically created subroutines?
by NatureFocus (Scribe) on Feb 25, 2007 at 17:00 UTC

    I too am interested in controlling Photoshop from Perl, but haven't gotten to it yet. On the Photoshop side I found a couple of books on the subject, in case you had not found them. One is the "Adobe Photoshop CS2 official JavaScript reference" and "Read Less-Learn more - Adobe Scripting".

    I would be very interested to see what you come up with.

    -Eugene