So let's use perl to parse Perl...
use v5.10;
use strict;
use warnings;
{
package SubLister;
use Class::Inspector;
sub list_subs {
my $number = int rand 999_999_999;
our @SUBS = ();
eval qq{
package Random$number;
}.shift.q{
BEGIN {
@SubLister::SUBS = @{Class::Inspector->functions(__PAC
+KAGE__)};
die;
}
};
return @SUBS;
}
}
my $source_code = <<'SRC';
sub foo { 1 }
sub bar { 2 }
sub baz { 3 }
CORE::say("We don't want to execute this!");
SRC
say("Got: $_") for SubLister::list_subs($source_code);
perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'