1

私は以下のようなコードを持っています。関数(によって呼び出される)でファイル$File::Find::name(この場合は./tmp/tmp.h)を開くと、「ファイルを開くことができません。/tmp/tmp.hreason=temp.plの36行目98行目にそのようなファイルまたはディレクトリはありません。 。」searchFile::Find::find

別の関数でファイルを直接開くと、ファイルを開くことができます。誰かがこの振る舞いの理由を教えてもらえますか?Windowsでactiveperlを使用していますが、バージョンは5.6.1です。

use warnings;
use strict;
use File::Find;

sub search
{
    return unless($File::Find::name =~ /\.h\s*$/);
    open (FH,"<", "$File::Find::name") or die "cannot open the file $File::Find::name  reason = $!";
    print "open success $File::Find::name\n";
    close FH;

}

sub fun
{
    open (FH,"<", "./tmp/tmp.h") or die "cannot open the file ./tmp/tmp.h  reason = $!";
    print "open success ./tmp/tmp.h\n";
    close FH;

}

find(\&search,".") ;
4

3 に答える 3

10

参照:現在検索されているディレクトリに変更されたperldoc File::Find後、必要な機能(あなたの場合は検索)が呼び出されます。File::Find::findご覧のとおり$File::Find::name、検索を開始した場所からのファイルへの相対パスが含まれています。現在のディレクトリが変更された後は機能しないパス。

次の 2 つのオプションがあります。

  1. File::Find が検索するディレクトリに移動しないように指示します。find( { wanted => \%search, no_chdir => 1 }, '.' );
  2. $File::Find::nameまたは、$_代わりに,を使用しないでください。
于 2009-08-19T10:07:29.997 に答える
0

./tmp/がシンボリック リンクの場合は、次の手順を実行する必要があります。

find( { wanted => \&search, follow => 1 }, '.' );

それは役に立ちますか?

于 2009-08-19T09:57:16.100 に答える
-1

現在の作業ディレクトリでファイルを検索する場合は、Cwd を使用できます。

use warnings;
use strict;
use File::Find;
use Cwd;

my $dir = getcwd;

sub search
{
    return unless($File::Find::name =~ /\.h\s*$/);
    open (FH,"<", "$File::Find::name") or die "cannot open the file $File::Find::name  reason = $!";
    print "open success $File::Find::name\n";
    close FH;

}

find(\&search,"$dir") ;
于 2009-08-19T10:08:34.160 に答える