如何用perl查找某目录下 及其子目录下的某类文件

如何用perl查找某目录下 及其子目录下的某类文件

Perl 代码如下,目的是查找目录"/tmp/file/"及其子目录下所有的以"txt"为结尾的文件
可是并不能把所有的文件的列出来,如根目录/tmp/file/下面的xtrasrv.txt就不能列出, 不知为啥进入
子目录bin后就不再继续查找了,谁能帮忙

-rw-rw-r--    1 llu     llu           186 Nov20 03:39 Hello.pm
-rw-rw-r--    1 llu     llu           65 Nov 22 03:00 all_pl
drwxrwxr-x    2 llu     llu          4096 Nov 3007:16 bin
-rw-rw-r--    1 llu     llu            1 Nov 20 03:01 myfile.txt
-rwxrwxr-x    1 llu     llu           52 Nov 20 03:23 test.pl
-rw-rw-r--    1 llu     llu         27851 Nov 22 03:05xtrasrv.txt


#!/usr/bin/perl
sub processdirectories (@) {
        my @dirnames = @_;
        my $fname;
        my $cFILE;
        my $dirname;
        my $hDir = gensym;    # used as local directoryhandle
        foreach $dirname (@dirnames) {
                $dirname =~ s/\/+$//;
                if ( opendir( $hDir, $dirname ) ) {
                    while ( $fname = scalar readdir($hDir) ) {
                            print "$fname\n";
                            next if ( $fname eq "." );
                            next if ( $fname eq ".." );
                            next if ($fname =~ /^\./ );    # do not include files/directories,starting with .
                            $cFILE = $dirname . "/" . $fname;
                            if ( -d$cFILE ) {
                                    if ( !-l$cFILE ) {         # don't follow links!
                                          processdirectories($cFILE);
                                    }
                            }elsif($fname=~ /.*txt$/) {
                                    print$fname,"\n";
                            }else{

                            }
                        }
                        closedir($hDir);
                }
        } # End for each
}
#print "hello";
processdirectories("/tmp/file/");
1;
perldoc File:Find;

man find ( if *nix only)

可是不知道这个函数错在哪里
用 File::Find 已经实现了

#!/usr/bin/perl -w
use File::Find;

sub print_name_if_dir
{
my $file = $_;
    if( $file =~ /.*txt$/){
        my $ff = $File::Find::name;
        print $file,$ff,"\n";
        unlink($ff);
    }
}

find(\&print_name_if_dir, "/usr/tmp");
1;


QUOTE:
原帖由 tony9427 于 2007-11-30 16:53 发表
可是不知道这个函数错在哪里

Hi,
错在 here:

QUOTE:
my $hDir = gensym;    # used as local directoryhandle

Set $hDir as undef, like this:
my $hDir;
or my $hDir = undef;

Why? Please see more >perldoc -f opendir in details:
perldoc -f opendir
        If DIRHANDLE is an undefined scalar variable (or array or hash
        element), the variable is assigned a reference to a new anonymous
         dirhandle.

--ulmer
十分感谢

得慢慢研究一下Symbol:gensym 具体有什么作用