0
sub open_files {

    my @files = @_;
    my @lines;

    foreach (@files){
        print "$_\[1\]\n";
    }

    foreach my $f (@files){
        print "$f\[2\]\n";
        open(my $fh,'<',$f) or die " '$f' $!";
            print "$fh\[3\]\n";
        push(@lines,<$fh>);
        close($fh);
    }

    return @lines;
}

嗨,我在打开绝对路径存储在数组中的文件时遇到问题。

我想要做的是遍历数组并打开每个文件,然后将它们的数据存储在@lines数组中,然后关闭文件句柄。

但是我能够打开.html存储在第一个子目录中的文件,.e.g /a/abc.html or /b/bcd.html但是它没有打开(或解析)子目录中的文件,例如/a/aa/abc.html or /b/bb/bcd.html

print statements在脚本中添加了一些额外内容,并为不同的打印行编号了它们的输出,例如[1] [2] [3].

这是执行上述代码的结果:

完整代码是: pastebin 完整代码

/mnt/hgfs/PERL/assignment/test/a/aa/1 - Copy - Copy (2).htm[1]
/mnt/hgfs/PERL/assignment/test/a/aa/1 - Copy - Copy (2).htm[2]
GLOB(0x898ad20)[3]
/mnt/hgfs/PERL/assignment/test/b/bb/1 - Copy - Copy (2).htm[1]
/mnt/hgfs/PERL/assignment/test/b/bb/1 - Copy - Copy (2).htm[2]
GLOB(0x898ae40)[3]
/mnt/hgfs/PERL/assignment/test/a/1 - Copy - Copy (2).htm[1]
/mnt/hgfs/PERL/assignment/test/b/1 - Copy - Copy (2).htm[1]
/mnt/hgfs/PERL/assignment/test/c/1 - Copy - Copy (2).htm[1]
/mnt/hgfs/PERL/assignment/test/a/1 - Copy - Copy (2).htm[2]
GLOB(0x898ae40)[3]
/mnt/hgfs/PERL/assignment/test/b/1 - Copy - Copy (2).htm[2]
GLOB(0x898ae40)[3]
/mnt/hgfs/PERL/assignment/test/c/1 - Copy - Copy (2).htm[2]
GLOB(0x898ae40)[3]

如果你们需要完整的代码,那就是: pastebin 完整代码

4

2 回答 2

2
use warnings;
use strict;

die "Usage: $0 (abs path to dir) " if @ARGV != 1;

my $dir = shift @ARGV;
our @html_files = (); 

file_find($dir);
print "html files: @html_files\n";

sub file_find {
    my $dir = shift;

    opendir my $dh, $dir or warn "$dir: $!";
    my @files = grep { $_ !~ /^\.{1,2}$/ } readdir $dh;
    closedir $dh;

    for my $file ( @files ) { 
        my $path = "$dir/$file";

        push @html_files, $file if $file =~ /\.html$/;
        file_find($path) if -d $path;
    }   
}
于 2013-05-09T14:10:02.377 回答
1

简短的回答是glob不会递归到子目录中。

相反,使用File::Find

use strict;
use warnings;
use feature 'say';
use File::Find 'find';

my @files;
find( sub { push @files, $File::Find::name if /\.html?$/ }, 'base_dir' );

say for @files;
于 2013-05-09T13:48:03.833 回答