Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中获取嵌套目录内容_Perl_File_Directory - Fatal编程技术网

如何在Perl中获取嵌套目录内容

如何在Perl中获取嵌套目录内容,perl,file,directory,Perl,File,Directory,我正在尝试编写一个脚本来处理某些文件。数据是这样组织的:有一个文件夹(我们称之为X),我的脚本将放在这个文件夹中。在同一文件夹中,有一个子文件夹名为“data”。其中包含多个具有不同名称的子文件夹,每个子文件夹都包含许多文件(没有其他子文件夹,只有文件)。我需要处理子文件夹中的所有文件(更具体地说,对每个文件运行一个函数),然后合并子文件夹中所有文件的结果,因此每个文件夹都有一个结果(无论包含多少文件) 问题是,我无法访问这些文件,以便在它们上运行我的函数。我现在得到的是: $dirname =

我正在尝试编写一个脚本来处理某些文件。数据是这样组织的:有一个文件夹(我们称之为X),我的脚本将放在这个文件夹中。在同一文件夹中,有一个子文件夹名为“data”。其中包含多个具有不同名称的子文件夹,每个子文件夹都包含许多文件(没有其他子文件夹,只有文件)。我需要处理子文件夹中的所有文件(更具体地说,对每个文件运行一个函数),然后合并子文件夹中所有文件的结果,因此每个文件夹都有一个结果(无论包含多少文件)

问题是,我无法访问这些文件,以便在它们上运行我的函数。我现在得到的是:

$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) ) ){