thanks ronald
for the suggestion which looks better but is just as ineffecient as mine
original. i timed both versions twice traversing 878 files in 1006
directories of total size 839.441066 MB. both taking 280 secs each time around.
to clarify this is how i get the filenames w original code embedded (commented)
sub check_folders {
my($dir) = @_;
local (*FOLDER);
my(@subfiles, $file, $specfile);
opendir(FOLDER, $dir) or die "cannot open $dir $!";
@subfiles = readdir(FOLDER);
closedir(FOLDER);
foreach $file (sort(@subfiles)) {
my $specfile = $dir.$delimiter.$file;
$level++; # loop counter
if (-f $specfile) {
$ext = basename($specfile);
$ext = "none" unless ($ext =~ s/.*(\.[^.]+)$/$1/);
push @{ $file_extensions{$ext} }, $specfile;
## original was:
# $extensions{$ext} = $level;
# push(@complete, $ext, $specfile);
}
if (-d $specfile && $file !~ /^\.{1,2}$/) {
&check_folders($specfile);
}
}
}
foreach my $extension (sort keys %file_extensions) {
print $extension . "\n\n";
foreach my $file (@{ $file_extensions{$extension} }) {
print $file. "\n";
}
print "\n\n";
}
## original:
foreach my $key (sort(keys %extensions)) {
print "$key\n\n";
for (my $i = 0; $i <= $#complete; $i++) {
if ($complete[$i] eq $key) {
print $complete[$i+1] . "\n";
}
}
print "\n\n";
}
> You would have to tie each inner hash as a Tie::IxHash as well.
tried inside a for loop, did not work, but never mind
thanks again though
allan