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
个文件,但是它没有打开(或解析)子子目录中的文件,例如{ {1}}
我在我的脚本中添加了一些额外的/a/aa/abc.html or /b/bb/bcd.html
,并为不同的打印行编号输出,例如print statements
。
这是执行上述代码的结果:
完整代码为:pastebin Full code
[1] [2] [3]
如果你们需要完整的代码,那就是:pastebin Full code
答案 0 :(得分: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;
}
}
答案 1 :(得分: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;