1

これもまた初心者の質問であることは承知していますが、私は非常にイライラしており、再び悟りを開きたいと思っています。皆さんの指導により、グロブ関数を使用してディレクトリ内の各ファイルの内容を読み取る方法を既に学びました。現在、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返すことに注意してください。ほとんどの場合、特別なディレクトリ エントリの 1 つを開こうとしているか、これらの関数を使用している場合は一般的に除外する必要があります。...

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

また、これは完全なパスではなく相対パスのみを返すというAndy Rossの提案にも注意してください。

于 2009-10-13T02:40:49.760 に答える