В принципе, вы не можете без анализа ваших файлов.Правильный путь - использовать какой-то стандартный модуль Perl, например https://perldoc.pl/Module::Metadata,, но если вы хотите сделать это самостоятельно, с помощью следующего фрагмента вы можете извлечь все пространства имен из каждого файла (да .. файл - это просто контейнер, поэтому у вас может быть больше пакетов внутри).
Быстрый и грязный способ:
my $PACKAGES ;
my @files = ('lib/Foo.pm','lib/Bar.pm') ;
my $row ;
map {
open PKGFILE , '<', $_ or die "Got error opening file $_: $!" ;
while ( $row = <MODULE>){
if ( $row =~ /\s*package\s+([\S]+)(.*?)[;{]/ ){
# rx modified on Grinnz review
push @{$PACKAGES->{ $_ }} , $1 ;
# last ; # <== uncomment if you are sure each file
# contains only one package
} ;
}
close PKGFILE ;
} @files ;
Предполагая, что у нас есть два файла:
1) lib/Foo.pm
(с 2пакеты внутри)
package Banana::Joe 0.003 ;
...code...
package Papaya::Frank 0.001 ;
...code...
1 ;
2) lib/Bar.pm
package Apple::Steve 0.013 ;
...code...
1 ;
$PACKAGES
будет:
{
'lib/Bar.pm' => [
'Apple::Steve'
],
'lib/Foo.pm' => [
'Banana::Joe',
'Papaya::Frank'
]
};