use Win32::API; my $GetLogicalDriveStrings = new Win32::API(kernel32 => GetLogicalDriveStrings => ['N', 'P'], 'N'); my $drives = "\0" x 4000; my @drives; if($GetLogicalDriveStrings->Call(length $drives, $drives)) { @drives = split /\0+/, $drives; } #### use File::Find; my %results; find sub { -f and push @{$results{$File::Find::dir}}, $_ if -e && /^perl/ }, @drives; use Data::Dumper; print Dumper \%results;