Чтобы пройтись по деревьям каталогов @INC без использования внешней программы, такой как ls (1), можно использовать модуль File::Find::Rule
, который имеет хороший декларативный интерфейс.
Кроме того, вы хотите отфильтровать дубликаты на случай, если предыдущие версии Perl содержат те же модули. Код для этого выглядит так:
#! /usr/bin/perl -l
use strict;
use warnings;
use File::Find::Rule;
my %seen;
for my $path (@INC) {
for my $file (File::Find::Rule->name('*.pm')->in($path)) {
my $module = substr($file, length($path)+1);
$module =~ s/.pm$//;
$module =~ s{[\\/]}{::}g;
print $module unless $seen{$module}++;
}
}
В конце цикла у вас также будут все имена модулей в качестве ключей в% увиденного хэша. Код может быть адаптирован для сохранения канонического имени файла (заданного в $ file) в качестве значения ключа вместо числа увиденных раз.