我知道有更简单的方法可以做到这一点,但是当我找到它们时我需要对文件进行一些操作,所以这就是我想要的方式。
我正在使用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
正在被替换,以便它只位于底部目录。此代码将永远运行。
答案 0 :(得分: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);
}
}
}