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;-)@draegtunPath::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;-)@draegtunPath::Class
wins!有多少人真正使用了“卷”(比如Windows上的C:在使用代码编写File::Spec时考虑到了吗?我想不是。