我正在尝试使用天神模块,但它失败了,因为它无法找到模板文件但存在。我已经在模块中添加了一些调试语句,并且它没有传递
return $filepath if (-f $filepath);
即使$ filepath正确。我试过一个独立的脚本,它工作正常,但当我将它复制到mod_perl脚本时,它失败了。有什么想法吗?
$ filepath是一个完整的绝对路径:/something/another/dir/2/filename.plhtml
这是模块的功能。注意我的“调试”...它打印文件的正确路径777,但它从不打印YES。
sub find_template_file {
my ($this, $filename) = @_;
my $path = $this->{path};
if ($path) {
my $sep = $^O eq 'MSWin32' ? '\\\\' : '/';
foreach my $dirname (@$path) {
my $filepath = $dirname . $sep . $filename;
print STDERR "--$filepath--\n";
if (-f $filepath){
print STDERR "--- YES ---\n\n";
}
return $filepath if (-f $filepath);
}
} else {
return $filename if (-f $filename);
}
my $s = $path ? ("['" . join("','", @$path) . "']") : '[]';
die "Tenjin::Engine: $filename not found (path=$s).";
}
失败
Tenjin :: Engine:未找到index.plhtml(path = ['/ var / 2.0 / templates / search'])。在/usr/lib/perl5/site_perl/5.8.8/Tenjin/Engine.pm第56行。\ n
答案 0 :(得分:5)
Apache进程还需要在每个子目录上执行 read和执行访问,直到完整路径。 (如果涉及符号链接,确定访问的内容将更加棘手)。
如果您可以在Web服务器上调试脚本,您可能希望让Perl向您发送错误消息:
if (! -f $filename) {
open(ACK, "<", $filename);
print STDERR "Couldn't open $filename because of: $!\n";
}
答案 1 :(得分:2)
-f将返回false,但如果由于其他原因导致stat调用失败,则返回undef。
测试返回是否已定义,如果未定义,则显示将在$!中设置的错误。 这可能会给你一个线索。
答案 2 :(得分:1)
给-f
文件的完整路径,并确保它可以被Apache读取。
答案 3 :(得分:0)
您使用的是绝对路径名还是相对路径名?您对当前目录的假设可能只是错误。
答案 4 :(得分:0)
我将完全忽略你的要求并回答完全不同的事情!我真是太疯狂了!
嗯,不是,我正在利用核心perl模块File::Find,而不是编写自己的目录解析器。
根据要求,这是我实际回答的问题: “如何在特定路径集的子目录中的某个位置找到文件的路径?”
use File::Find;
# Other parts of the class here
sub find_template_file {
my ($this, $filename) = @_;
my $file_path;
my $path = $this->{path};
# Note that this inner sub uses variables we defined above
find(sub {
if ($_ eq $filename)
$file_path = $File::Find::name;
}, @$path);
if ($file_path)
return $file_path;
my $s = $path ? ("['" . join("','", @$path) . "']") : '[]';
die "Tenjin::Engine: $filename not found (path=$s).";
}