0

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

我正在为 Windows 使用草莓 Perl。

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正在被替换,以便它位于底部目录。此代码将永远运行。

4

1 回答 1

4

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

另请注意,您应该始终使用 use strict; use 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);
    }
  }
}
于 2013-04-11T12:03:02.927 回答