Windows 如何从所需函数内部打开由file::Find找到的文件?

Windows 如何从所需函数内部打开由file::Find找到的文件?,windows,perl,file-find,Windows,Perl,File Find,我有如下代码。如果我在我的搜索函数(由文件::查找::查找调用)中打开文件$file::Find::name(在本例中是/tmp/tmp.h),它会说“无法打开文件。/tmp/tmp.h原因=temp.pl第36行,第98行没有这样的文件或目录。” 如果我在另一个函数中直接打开该文件,则可以打开该文件。 有人能告诉我这种行为的原因吗?我在Windows上使用activeperl,版本是5.6.1 use warnings; use strict; use File::Find; sub sea

我有如下代码。如果我在我的
搜索
函数(由
文件::查找::查找
调用)中打开文件
$file::Find::name
(在本例中是
/tmp/tmp.h
),它会说“无法打开文件。/tmp/tmp.h原因=temp.pl第36行,第98行没有这样的文件或目录。”

如果我在另一个函数中直接打开该文件,则可以打开该文件。 有人能告诉我这种行为的原因吗?我在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,".") ;
使用警告;
严格使用;
使用File::Find;
子搜索
{
返回,除非($File::Find::name=~/\.h\s*$/);
打开(FH),如果./tmp/是符号链接,则需要执行以下操作:

find( { wanted => \&search, follow => 1 }, '.' );
这有帮助吗?

如果./tmp/是一个符号链接,则需要执行以下操作:

find( { wanted => \&search, follow => 1 }, '.' );
这有帮助吗?

请参阅:所需功能(在您的案例中搜索)将在
File::Find::Find
更改为当前搜索的目录后调用。如您所见,
$File::Find::name
包含相对于搜索开始位置的文件路径。当前目录更改后该路径将不起作用

您有两个选择:

  • 告诉File::Find不要更改到它搜索的目录:
    Find({wanted=>\%search,no\u chdir=>1},'.');
  • 或者不要使用
    $File::Find::name
    ,而是使用
    $\uu
  • 请参阅:
    File::Find::Find
    更改为当前搜索的目录后,将调用所需函数(在您的情况下搜索)。如您所见,
    $File::Find::name
    包含相对于搜索开始位置的文件路径。当前目录更改后,该路径将不起作用

    您有两个选择:

  • 告诉File::Find不要更改到它搜索的目录:
    Find({wanted=>\%search,no\u chdir=>1},'.');
  • 或者不要使用
    $File::Find::name
    ,而是使用
    $\uu

  • 如果要在当前工作目录中搜索文件,可以使用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") ;
    
    使用警告;
    严格使用;
    使用File::Find;
    使用化学武器;
    my$dir=getcwd;
    子搜索
    {
    返回,除非($File::Find::name=~/\.h\s*$/);
    
    打开(FH),如果要在当前工作目录中搜索文件,可以使用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") ;
    
    使用警告;
    严格使用;
    使用File::Find;
    使用化学武器;
    my$dir=getcwd;
    子搜索
    {
    返回,除非($File::Find::name=~/\.h\s*$/);
    
    open(FH),“我刚刚使用了你的代码,它对我来说很好。你使用了其他代码吗?两条注释:将第一行更改为1)
    return,除非/\.h\s*$/
    ,以简洁明了。当然,你可能还需要进行不区分大小写的匹配,我不确定你为什么要接受文件名后面的空格。2)无需在
    open
    调用中引用
    $File::Find::name
    。请使用三个参数调用来打开。我刚刚使用了您的代码,对我来说效果很好。您是否使用了其他代码?两条注释:将第一行更改为1)
    返回,除非/\.h\s*$/
    以简洁明了。当然,您可能还需要进行不区分大小写的匹配,我不确定您为什么要在文件名后接受尾随空格。2)无需在
    打开
    调用中引用
    $file::Find::name
    。请使用三个参数调用打开。这是因为getcwd将返回一个绝对路径,所以它实际上可以工作。但是你的答案确实需要更多的解释。这可能确实可以工作,因为getcwd将返回一个绝对路径。但是你的答案确实需要更多的解释。他在Windows上。我怀疑这与符号链接有关。Does open()那么在Windows上使用正向斜杠呢?Re:symlinks-装载的UNIX/Linux共享如何…将从Windows自动跟踪符号链接吗?@draegtun是的,
    open
    可以使用正向斜杠。
    首选“tmp/tmp.h”
    “tmp\\tmp.h”
    (我更喜欢
    文件::Spec catfile
    )。我不知道你的第二个问题的答案。@Sinan:谢谢你提供的信息。我在Windows上使用Perl已经快10年了!!re:File::Spec…是的,很好,但我会提出u Path::Class;-)@draegtun
    Path::Class
    wins!有多少人真正使用了“卷”(比如Windows上的C:使用代码编写File::Spec时考虑到了吗?我想不是。他在Windows上。我怀疑这与符号链接有关。是否打开()那么在Windows上使用正向斜杠呢?Re:symlinks-装载的UNIX/Linux共享如何…将从Windows自动跟踪符号链接吗?@draegtun是的,
    open
    可以使用正向斜杠。
    首选“tmp/tmp.h”
    “tmp\\tmp.h”
    (我更喜欢
    文件::Spec catfile
    )。我不知道你的第二个问题的答案。@Sinan:谢谢你提供的信息。我在Windows上使用Perl已经快10年了!!re:File::Spec…是的,很好,但我会提出u Path::Class;-)@draegtun
    Path::Class
    wins!有多少人真正使用了“卷”(比如Windows上的C:在使用代码编写File::Spec时考虑到了吗?我想不是。