use warnings; use strict; use Data::Dumper; use PPI; my $file = 'file.pl'; my $PPI_doc = PPI::Document->new($file); my $PPI_statements = $PPI_doc->find('PPI::Statement'); my %layout; my $package; for my $statement (@$PPI_statements) { if (ref $statement eq 'PPI::Statement::Package') { $package = $statement->namespace; } if (ref $statement eq 'PPI::Statement::Sub') { push @{ $layout{$package} }, $statement->name; } } print Dumper \%layout; #### $VAR1 = { 'Foo' => [ 'three', 'four' ], 'Fee' => [ 'one' ], 'Fi' => [ 'two' ] }; #### my $doc = PPI::Document->new($file); my $stmts = $doc->find('PPI::Statement'); my %layout; my @order; my $package; for (@$stmts) { if (ref $_ eq 'PPI::Statement::Package') { $package = $_->namespace; push @order, $package; } if (ref $_ eq 'PPI::Statement::Sub') { push @{ $layout{$package} }, $_->name; } } for (@order) { print "$_:\n"; for (@{ $layout{$_} }) { print "\t$_\n"; } } #### Fee: one Fi: two Foo: three four