【发布时间】:2013-02-12 05:18:55
【问题描述】:
我想编写一个 Perl 脚本,它从目录树的顶部开始(在命令行参数中提供)并递归地遍历每个子目录,对每个文件执行特定操作。
我为此使用finddepth,但是当我在距离基目录两级或更高级别的目录上运行脚本时,它似乎不起作用。
这是我的代码:
#!/usr/local/bin/perl -w
use strict;
use File::Copy;
use File::Find;
use File::Basename;
use File::Path;
finddepth(\&file_list, @ARGV);
sub file_list {
my ($file_path, $name, $path, $suffix);
$file_path = $File::Find::name;
($name, $path, $suffix) = fileparse($file_path, /\.*/);
my $fullname = $name . $suffix;
my $file = $fullname;
if ($file =~ /^[^\.].*[^\.pl]$/) {
copy($file, "$file.orig");
open(FILE, "$file");
my @file_data = <FILE>;
close(FILE);
open(FOUT, ">$file") or die " \n File cannot be opened !";
foreach my $line (@file_data) {
if ($line =~ /^\s+Error:/) {
$line =~ s/([^-]\d+)/ \*\*/gc;
print FOUT $line;
}
else {
print FOUT $line;
}
}
close(FOUT);
}
}
始终抛出以下警告/错误:
- 读取关闭的文件句柄
- 无法打开文件!
我似乎无法弄清楚为什么会这样。我试图让我的问题尽可能具体。如果您需要更多信息,请告诉我。谢谢。
【问题讨论】:
-
您使用的是
strict,但为什么不使用warnings? -
这些警告/错误是在哪里抛出的?他们不显示文件名吗?行号?
-
你的正则表达式
/^[^\.].*[^\.pl]$/应该匹配什么? -
这是在第 37 行引发的在关闭的文件句柄
上读取和无法打开文件时引发的警告。此外,我从代码中删除了警告,只是为了看看会发生什么。理想情况下它应该在那里。 @Borodin我不希望我的正则表达式匹配以“。”开头的文件。或以“.pl”结尾。