我必须在perl中执行一个程序。而且我很新。它的任务是 将有目录,里面有许多子目录将在那里。每个子目录包含更多的子目录。最后,子目录链的末尾会有文件。如果文件格式为" .TXT"我应该删除包含.TXT文件的主目录旁边的子目录。
例如raghav \ abc \ ccd \ 1.txt然后我应该删除子目录" abc"。
我的代码是
#!/usr/bin/perl
use warnings;
use strict;
use Cwd qw(abs_path);
my $path ="d:\\raghav";
search_all_folder($path);
sub search_all_folder {
my ($folder) = @_;
if ( -d $folder ) {
chdir $folder;
opendir my $dh, $folder or die "can't open the directory: $!";
while ( defined( my $file = readdir($dh) ) ) {
chomp $file;
next if $file eq '.' or $file eq '..';
search_all_folder("$folder/$file"); ## recursive call
read_files($file) if ( -f $file );
}
closedir $dh or die "can't close directory: $!";
}
}
sub read_files {
my ($filename) = @_;
if($filename= ~/.txt/)
rmdir;
}
}
答案 0 :(得分:4)
永远不要实现自己的目录遍历。请改用File::Find
。它更有效,更不容易破碎。
#!/usr/bin/perl
use warnings;
use strict;
use File::Find;
my $search_path = "d:\\raghav";
my %text_files_found_in;
sub find_text_files {
if (m/\.txt$/i) {
## you may want to transform this first, to get a higher level directory.
$text_files_found_in{$File::Find::dir}++;
}
}
find( \&find_text_files, $search_path );
foreach my $dir ( keys %text_files_found_in ) {
print "$dir contained a text file\n";
##maybe delete it, but don't until you're sure the code's working!
}
您现在已经有了一个文件列表,您可以根据这些文件找出要删除的内容然后将其删除。 rmdir
虽然没有做到这一点 - 但这只适用于空目录。您可以整理文件列表(就像这样),也可以随时找出要删除的路径,并将其插入哈希。 (所以你不会得到欺骗)。
无论哪种方式 - 最好先运行查找,删除第二个,而不是尝试删除可能仍在遍历的树。
编辑:这个程序的作用:
find_text_files
find
(在File :: Find模块中),并告诉它在它找到的每个文件上运行find_text_files
的递归遍历。 find_text_files
在triee中的每个文件上调用($search_path
下方)。当它被称为:
File::Find
将$_
设置为当前文件名。我们会与m/\.txt$/
进行匹配,看看它是否为文本文件。 File::Find
还设置了另外两个变量:$File::Find::dir
- 到此文件的目录路径。并$File::Find::file
到完整文件路径。如果模式匹配,我们会将$File::Find::dir
插入哈希text_files_found_in
。find
完成,我们就会有一个名为text_files_found_in
的哈希,它包含找到文本文件的所有目录的键。 keys %text_files_found_in
上进行迭代以识别 - 并删除。* *此脚本中没有删除代码 - 您必须自己对其进行排序。我没有把任何可能删除内容的东西放在互联网上,那些不完全理解它的人可能只是盲目地操作它。