use Data::Dumper; my %g_modules; Traverse( $_ ) for ( @INC ); print Dumper \%g_modules; sub Traverse { my $dir = shift; opendir my $dh, $dir or die "$!: $dir\n"; for my $file ( grep !/^\./, readdir $dh ) { my $path = "$dir/$file"; if ( -d $path ) { Traverse ( $path ); } elsif ( $file =~ /\.pm$/ ) { $g_modules{ $file } = 1; } } closedir $dh; }