-f文件测试运算符是否在mod_perl中工作?

时间:2009-10-01 17:57:15

标签: perl mod-perl

我正在尝试使用天神模块,但它失败了,因为它无法找到模板文件但存在。我已经在模块中添加了一些调试语句,并且它没有传递

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

5 个答案:

答案 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).";
}