0

recursive function在 Perl 中,我需要从父目录读取文件到它的最后一个文件,任何子目录都需要读取这些文件!所以我在我!代码;

sub fileProcess{
(my $file_name)=@_;
print "$file_name it is file\n";
}
sub main{
    (my $dir)=@_;
    chdir $dir; 
    my $tmp=`pwd`;
    my @tmp =<*>;
    chomp(@tmp);    
    foreach my $item(@tmp){
        chomp($item);
        if(-d $item){
            dirProcess("$tmp/$item");
        }else{
            fileProcess($item);
        }
    } 
}
sub dirProcess{

    (my $file_name)=@_;

    print ">>the corresponding dir is $file_name<<";    
    main($file_name);

}
my $home="../../Desktop";
chdir $home;
my $path=`pwd`;
main($home);
4

2 回答 2

1

这是一个递归搜索的子:

sub find_files {
    my ($dir) = @_;
    my (@files, @dirs) = ();
    my (@allfiles, @alldirs) = ();

    opendir my $dir_handle, $dir or die $!;
    while( defined( my $ent = readdir $dir_handle ) ) {
        next if $ent =~ /^\.\.?$/;

        if( -f "$dir/$ent" ) {
            push @files, "$dir/$ent";
        } elsif( -d "$dir/$ent" ) {
            push @dirs, "$dir/$ent";
        }
    }
    close $dir_handle;

    push @allfiles, @{ process_files($_) } for @files;
    push @alldirs, @{ find_files($_) } for @dirs;

    return \@alldirs;
}
于 2013-04-23T18:06:17.980 回答
0

您的代码不起作用的主要原因是,当dirProcessmain再次调用时,它会调用chdir另一个目录。@tmp这意味着找不到数组中的其余文件。

为了解决这个问题,我刚刚chdir $dir在调用dirProcess. 另外我有

  • 添加use strictuse warnings。你必须始终将这些放在程序的顶部。

  • pwd删除了所有不必要的调用。你知道你现在的工作目录是因为你刚刚设置了它!

  • 删除了不必要chomp的电话。来自的信息glob永远不会有尾随换行符。确实需要咀嚼的一个字符串是$tmp但你没有这样做!

它仍然不是一段很好的代码,但它可以工作!

use strict;
use warnings;

sub fileProcess {
    (my $file_name) = @_;
    print "$file_name it is file\n";
}

sub main {

    (my $dir) = @_;

    chdir $dir;
    my @tmp = <*>;

    foreach my $item (@tmp) {
        if (-d $item) {
            dirProcess("$dir/$item");
            chdir $dir;
        }
        else {
            fileProcess($item);
        }
    }
}

sub dirProcess {

    (my $file_name) = @_;

    print ">>the corresponding dir is $file_name<<\n";
    main($file_name);
}

my $home = "../../Desktop";

main($home);
于 2013-04-23T18:23:25.057 回答