我想使用递归来获取目录结构中所有文件的名称

时间:2013-04-11 11:48:52

标签: perl

我知道有更简单的方法可以做到这一点,但是当我找到它们时我需要对文件进行一些操作,所以这就是我想要的方式。

我正在使用Strawberry Perl for Windows。

my $baseDir = 'U:\\bin\\';
my $logFile = 'C:\\bintmp\\replace.log';

open(LOG,'>',$logFile);

folder($baseDir);

sub folder {
  my $input = shift; # May be a file or dir

  my @fileList = <$input*>;

  foreach my $file (@fileList) {
    if (-f ($file)) {   
      print LOG basename($file) . "\n";
      next;
    }

    if (-d ($file)) {
      folder($file); # Recursively call the folder function
    }
  }
  return 1;
}
close(LOG);

我想我知道发生了什么。当我深入研究新文件夹时,@fileList正在被替换,以便它只位于底部目录。此代码将永远运行。

1 个答案:

答案 0 :(得分:4)

问题在于*中的glob之前没有反斜杠,因此您正在搜索U:\bin\XX,然后搜索包含相同目录的U:\bin\XX*

另请注意,总是 use strictuse warnings;小写和下划线标识符是Perl局部变量的事实标准;并且总是检查您的open来电是否成功。

单引号字符串中不需要使用多个反斜杠,除非它位于字符串的末尾或者它们中有多个一起。

试试这个

use strict;
use warnings;

use File::Basename 'basename';

my $base_dir = 'U:\bin';
my $log_file = 'C:\bintmp\replace.log';

open(my $log, '>', $log_file) or die $!;

folder($base_dir);

sub folder {

  my ($input) = @_;

  my @file_list = glob "$input\\*";

  foreach my $file (@file_list) {
    if (-f $file) {   
      print $log basename($file), "\n";
    }
    elsif (-d $file) {
      folder($file);
    }
  }
}