我一直在搞乱我的代码一小时,但仍然没有进展。请听我说: 这段代码今天早些时候工作,它的作用是打开我给程序的目录,读取它,打开目录中的每个文件并单独读取它们以执行某些操作。
这是我打开和阅读文件的方式:
use strict;
use warnings;
use File::Slurp;
my $dir = shift @ARGV;
opendir(DH, $dir) or die "Directory Open Error!";
my @filelist = grep !/^\.\.?$/, readdir(DH);
my $filename;
foreach $filename(@filelist){
open(FH, $filename) or die "File Open Error!";
my $readFile = read_file($filename);
#more code
}
所以这可以更早地工作,我已经看到代码执行我想要它做的很好,但是当我在其他目录上运行代码时它返回
文件打开错误!在program.pl第15行
之后我再也无法工作了,无论我检查了多少,我仍然无法弄清楚出了什么问题。
由于错误发生在open()行上,我首先确保传递了正确的文件名,所以我打开了目录打开后的文件名列表,一切看起来都不错。
然后我摆脱了打开的目录部分,手动传递文件名:
$filename = shift @ARGV;
open(FH, $filename) or die "File Open Error!";
my $readFile = read_file($filename);
程序正常,文件打开就好了。所以我摆脱了错误信息并返回第一个代码,这就是我所看到的:
read_file'somefile' - sysopen:没有这样的文件或目录 program.pl第17行
第17行是我使用read_file来读取文件内容的行,这是在文件打开后发生的,我不明白现在发生了什么。再一次,这段代码工作得很早,我确实没有改变任何东西,除了输入,现在它完全停止工作
答案 0 :(得分:3)
我认为您需要过滤目录并将$ dir添加到文件名:
use strict;
use warnings;
use File::Slurp;
my $dir = shift @ARGV;
opendir(DH, $dir) or die "Directory Open Error!";
# here, use grep { !-d "$dir/$_"}
my @filelist = grep {!-d "$dir/$_"} readdir(DH);
my $filename;
foreach $filename(@filelist){
$filename = "$dir/$filename"; # also add dir
print $filename, "\n";
my $readFile = read_file($filename);
}
答案 1 :(得分:1)
这是使用File::Find::Rule从目录中获取文件名的选项。如果要进行目录递归,请忽略->maxdepth(1)
。在这种情况下,->name(qr/.+\.txt$/i)
仅过滤文本文件的文件名;如果您不希望过滤文件名,请省略此选项。 squiguy正确read_file
处理open
个文件。
use strict;
use warnings;
use File::Slurp qw/read_file/;
use File::Find::Rule;
my $dir = shift @ARGV or die 'No directory sent.';
-d $dir or die "Directory doesn't exist.";
my @filelist = File::Find::Rule->file()
->maxdepth(1)
->name(qr/.+\.txt$/i)
->in($dir);
for my $fileName (@filelist) {
my $fileContents = read_file $fileName;
#more code
}
完整文件路径提供给read_file
。
希望这有帮助!