如何使用perl读取文件及其子目录文件

时间:2013-04-23 17:47:18

标签: perl recursion

在Perl中我需要从父目录读取文件到它的最后一个文件,任何子目录都在那里我也需要读取这些文件!所以我在recursive function的帮助下尝试过类似的东西但是它给出了无限循环所以任何人都可以帮助我! 代码;

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);

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

您的代码无效的主要原因是,当dirProcess再次调用mainchdir到另一个目录。这意味着找不到@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);