Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re: extracting subroutine names (together with their packages) via PPI

by clueless newbie (Curate)
on Jul 06, 2023 at 19:45 UTC ( [id://11153296] : note . print w/replies, xml ) Need Help??


in reply to extracting subroutine names (together with their packages) via PPI

Steve, thanks for your prompt response!

Playing with something along the lines of:

use 5.032001; use warnings; use Data::Dumper; use Devel::Symdump; use Path::Tiny; use PPR::X; use lib qw(.); sub scan4subs { my ($file)=@_; my @packages; # use PPR:X to scan for package and get their names: my $text=(path($file)->slurp); while ($text =~ m{((?&PerlPackageDeclaration)) $PPR::X::GRAMMA +R}gx) { push @packages,$1 =~ m{package\ ([:\w]+) }x; }; #warn Data::Dumper->new([\@packages],[qw(*packages)])->Deepcop +y(1)->Indent(1)->Maxdepth(3)->Sortkeys(1)->Dump(),q{ }; # Use Devel::Symdump to dump the functions: require $file; my @subs; for my $package(@packages) { my $obj=Devel::Symdump->new($package); push @subs,$obj->functions; #warn Data::Dumper->new([\@subs],[qw(*functions)])->Deepco +py(1)->Indent(1)->Maxdepth(3)->Sortkeys(1)->Dump(),q{ }; }; return \@subs; }; print "@{scan4subs('Fee.pm')}";

which for the above chunk of code returns this

Fee::one Fi::two Fi::four Foo::three

Replies are listed 'Best First'.
Re^2: extracting subroutine names (together with their packages) via PPI
by stevieb (Canon) on Jul 06, 2023 at 20:14 UTC

    Good effort!

    That said, see my other response below, where I do the whole thing with PPI. I've been working on perl code parsing for two decades now, and by far, hands down the most reliable way is to use PPI.

    It's a lot less code as well ;)

    -stevieb