1

好吧,我知道这是另一个新手问题,但我非常沮丧,我希望再次获得启发。在各位的指导下,我已经学会了如何使用glob函数来读取目录中每个文件的内容。现在我正在尝试使用 readdir-foreach 组合来做同样的事情,但我一直收到“无法打开文件:权限被拒绝”错误。为什么这种情况发生在与管理员相同的目录、相同的文件和相同的我。有人可以告诉我我做错了什么吗?谢谢。

以下代码使用 glob 函数并且它可以工作:

#! perl
my $dir = 'f:/corpus/';
my @files = glob "$dir/*";
foreach my $file (@files) {
open   my $data, '<',"$file" or die "Cannot open FILE";
while(<$data>) {
...}

以下代码失败并且错误消息显示“无法打开文件:权限被拒绝”。但为什么?

#! perl
my $dir = 'f:/corpus/';
opendir (DIR,'f:/corpus/') or die "Cannot open directory:$!";
my @files=readdir(DIR);
closedir DIR;
foreach my $file (@files) {
open   my $data, '<',"$file" or die "Cannot open FILE:$!";
while(<$data>) {
...}
4

2 回答 2

8

readdir()函数只返回文件名,而不是完整路径。所以你试图打开例如"foo.txt"而不是“f:\corpus\foo.txt”。

于 2009-10-13T02:34:22.457 回答
4

你应该记住readdir返回目录名文件名。很可能您正试图打开一个特殊的目录条目.,或者..如果您使用这些功能,您通常需要过滤掉它:

foreach my $f (@files)
{
    # skip special directory entries
    if ($f ne '.' && $f ne '..')
    {
        # ...
        print "$f\n";
    }
}

另请注意Andy Ross的建议,即这只会返回相对路径,而不是完整路径。

于 2009-10-13T02:40:49.760 回答