【问题标题】:Does the -f file test operator work in mod_perl?-f 文件测试运算符是否在 mod_perl 中工作?
【发布时间】:2009-10-02 04:29:58
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • -f 检查当前工作目录,除非你给它一个完整的路径。
  • 您使用的是什么操作系统?如果您在 SELinux 中使用某些东西,请检查 setroubleshoot 日志是否有任何信息。
  • 禁用 SELinux...同样的事情。
  • 顺便说一句:my $sep = $^O eq 'MSWin32' ? '\\\\' : '/'; 是多余的:Windows 可以很好地理解正斜杠。如果您真的想要一种可移植的方式来创建路径名,请使用 File::Spec。

标签: perl mod-perl


【解决方案1】:

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

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

if (! -f $filename) {
    open(ACK, "<", $filename);
    print STDERR "Couldn't open $filename because of: $!\n";
}

【讨论】:

  • 只执行访问是准确的。
  • 没有想到这一点我觉得很愚蠢,特别是因为我今天早些时候在 ServerFault 上看到了一个同样问题的问题。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        我将完全忽略您的问题并回答完全不同的问题!我就是这么疯狂!

        嗯,不是真的,我正在利用核心 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).";
        }
        

        【讨论】:

        • 或许您可以明确说明您正在回答的问题?
        • ysth:我将它添加到我的回复中,但我也会把它贴在这里:“我如何找到位于特定路径集的子目录中某处的文件的路径?”
        猜你喜欢
        • 2017-07-05
        • 2011-11-25
        • 2012-05-05
        • 1970-01-01
        • 2015-12-20
        • 2011-05-06
        • 2015-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多