如何在Perl中获取嵌套目录内容
我正在尝试编写一个脚本来处理某些文件。数据是这样组织的:有一个文件夹(我们称之为X),我的脚本将放在这个文件夹中。在同一文件夹中,有一个子文件夹名为“data”。其中包含多个具有不同名称的子文件夹,每个子文件夹都包含许多文件(没有其他子文件夹,只有文件)。我需要处理子文件夹中的所有文件(更具体地说,对每个文件运行一个函数),然后合并子文件夹中所有文件的结果,因此每个文件夹都有一个结果(无论包含多少文件) 问题是,我无法访问这些文件,以便在它们上运行我的函数。我现在得到的是:如何在Perl中获取嵌套目录内容,perl,file,directory,Perl,File,Directory,我正在尝试编写一个脚本来处理某些文件。数据是这样组织的:有一个文件夹(我们称之为X),我的脚本将放在这个文件夹中。在同一文件夹中,有一个子文件夹名为“data”。其中包含多个具有不同名称的子文件夹,每个子文件夹都包含许多文件(没有其他子文件夹,只有文件)。我需要处理子文件夹中的所有文件(更具体地说,对每个文件运行一个函数),然后合并子文件夹中所有文件的结果,因此每个文件夹都有一个结果(无论包含多少文件) 问题是,我无法访问这些文件,以便在它们上运行我的函数。我现在得到的是: $dirname =
$dirname = "data";
opendir ( DIR, $dirname ) || die "Error in opening dir $dirname\n";
while( ($dirname2 = readdir(DIR)) )
{
next if $dirname2 eq ".";
next if $dirname2 eq "..";
opendir ( DIR2, $dirname2 ) || die "Error in opening dir $dirname2\n";
while( ($file = readdir(DIR2)) )
{
next if $file eq ".";
next if $file eq "..";
print( "file:$file\n" );
}
closedir(DIR2);
}
closedir(DIR);
它总是失败,并显示消息“打开目录时出错”。”alex'恰好是数据目录中的第一个目录。我的问题是——问题在哪里?这是实现我的目标的正确方法吗?我还担心,如果数据文件夹中也有文件,这会失败,因为我无法用opendir打开它,或者我可以吗
PS:对于那个糟糕的Perl代码,我很抱歉——我仍在努力学习这门语言
谢谢,
Peter您可以使用查找文件嵌套目录您可以尝试-创建或删除目录树
当我运行您的程序时,我认为您必须在打开目录时指定完整路径,即
opendir ( DIR2, $dirname.\\.$dirname2 ) || die "Error in opening dir $dirname2\n"; #running code on windows
它会工作的,试试看。您确定文件夹中只存在文件夹吗?添加附加检查:
next if !(-d $dirname2);
这是一个稍微整理过的问题版本
use strict;
use warnings;
use autodie;
use File::Spec::Functions qw'catdir catfile';
my $dirname = "data";
{
opendir my $dir_h, $dirname;
while( my $dirname2 = readdir($dir_h) ){
next if $dirname2 eq ".";
next if $dirname2 eq "..";
$dirname2 = catdir( $dirname, $dirname2 );
next unless -d $dirname2;
opendir my $dir_h2, $dirname2;
while( my $file = readdir($dir_h2) )
{
next if $file eq ".";
next if $file eq "..";
$file = catfile($dirname2,$file);
if( -f $file ){
print( "file:$file\n" );
}
}
# $dir_h2 automatically closes here
}
# $dir_h automatically closes here
}
如果要在5.12.0之前的Perl版本上运行它,则应使用defined()
包装while循环的条件
这是一个关键的错误。谢谢大家!<代码>模具“打开目录$dirname:$!”时出错。将给出原因,请参阅。更好的是,删除
| |模具…
零件,添加使用autodie qw(:all)代码>并让模块处理/报告错误。
while( my $dirname2 = readdir($dir_h) ){
while( defined( my $dirname2 = readdir($dir_h) ) ){