1

我有如下代码。如果我在我的函数(由 调用)中打开文件$File::Find::name(在本例中为。”./tmp/tmp.hsearchFile::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包含相对于搜索开始位置的文件路径。当前目录更改后将无法使用的路径。

你有两个选择:

  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 回答