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 を返します。

return が定義されているかどうかをテストし、定義されていない場合は $! に設定されるエラーを表示します。それはあなたに手がかりを与えるかもしれません。

于 2009-10-01T19:48:05.883 に答える
1

ファイル-fへのフル パスを指定し、Apache で読み取り可能であることを確認します。

于 2009-10-01T18:00:23.807 に答える
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 に答える
0

絶対パス名または相対パス名を使用していますか? 現在のディレクトリに関する仮定は、単に間違っている可能性があります。

于 2009-10-01T17:59:06.030 に答える