1

我正在尝试使用 Tenjin 模块,但它失败了,因为它找不到模板文件但它存在。我在模块中添加了一些调试语句,但它没有通过

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

4

5 回答 5

5

Apache 进程还需要对每个子目录直至完整路径的读取和执行访问权限。(如果涉及符号链接,则确定访问是什么会更棘手)。

如果您可以在 Web 服务器上调试脚本,您可能希望 Perl 向您发送错误消息:

if (! -f $filename) {
    open(ACK, "<", $filename);
    print STDERR "Couldn't open $filename because of: $!\n";
}
于 2009-10-01T18:18:06.790 回答
2

-f 如果文件不存在则返回 false,但如果 stat 调用因其他原因失败,则返回 undef。

测试是否定义了返回,如果没有,则显示将在 $! 中设置的错误。这可能会给你一个线索。

于 2009-10-01T19:48:05.883 回答
1

提供-f文件的完整路径,并确保 Apache 可以读取它。

于 2009-10-01T18:00:23.807 回答
0

您使用的是绝对路径名还是相对路径名?您对当前目录的假设可能完全是错误的。

于 2009-10-01T17:59:06.030 回答
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).";
}
于 2009-10-01T18:48:24.043 回答