# your version # my @tmp = readdir(DIR); # my @files = map { "$dir/$_" } grep { !/^\.{1,2}$/ && -f "$dir/$_" } @tmp; # my @dirs = map { "$dir/$_" } grep { !/^\.{1,2}$/ && -d "$dir/$_" } @tmp; # another version my @files; my @dirs; my @tmp = grep { ! /^\./ } readdir DIR; # grep once. foreach (@tmp) { if ( -d "$dir/$_" ) { # stat once. push @dirs, "$dir/$_"; } else { push @files, "$dir/$_"; } }