1

我一直在弄乱我的代码一个小时,但仍然没有进展。请听我说:这段代码今天早些时候工作了,它的作用是打开我给程序的目录,阅读它,然后打开目录中的每个文件并单独阅读它们以执行一些操作。

这是我打开和读取文件的方式:

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 读取文件内容的行,这是在文件打开后发生的,我不明白现在发生了什么。同样,这段代码早些时候工作得很好,除了输入我真的没有改变任何东西,现在它完全停止工作

4

2 回答 2

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);
}
于 2012-12-03T06:39:59.740 回答
1

这是一个使用File::Find::Rule从目录中获取文件名的选项。->maxdepth(1)如果您想要目录递归,请省略。在这种情况下,->name(qr/.+\.txt$/i)只过滤文本文件的文件名;如果您不想过滤文件名,请忽略此选项。 squiguyread_file处理opening 文件是正确的。

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.

希望这可以帮助!

于 2012-12-03T07:19:09.443 回答