スレッド化されたコメントを含む html ページを表示するために呼び出される perl mason コンポーネントがあります。MySQL データベースからのロードに Class DBI を使用します。
問題は、コードの途中で非常に不規則に変数の値が失われることがあることです。ページをリロードするだけで、コードが開始してから停止するまでの間にコードを変更していません。あるページの読み込みで価値があるだけで、次のページでは価値がないということでもありません。あるページの読み込みで、変数にオブジェクトへの参照 (名前を持つ「人」など) が含まれていることを示すために何かを出力し、後でその同じページの読み込みでコードを出力して、それを再度出力することができます。ないことを示します。次のページのロードでは、変数はずっとその値を保持している場合があります。起こっている唯一のことは、変数が $m->comp() への呼び出しを介して渡され、空の場合はデフォルトが適用されることです。
さらに、すべてのコメントに対して発生し、同じページの読み込みで何度もその値を効果的に失います。
残念ながら (または、見方によっては幸いなことに) 関連するすべてのコードを逐語的に投稿することはできませんが、要約すると次のようになります。「HERE」とマークされた 2 つのコメント行に注意してください。
<%init>
my @comments = $dc->document->search("type = 'comment'");
</%init>
<div>
<& '.comments', all_comments => \@comments &>
</div>
<%def .comments>
<%args>
$all_comments
</%args>
<%init>
my @comments;
@comments = @$all_comments;
</%init>
% for my $c (@comments) {
% my $poster = p($c->get_value('poster'));
% $poster = Person->get_anonymous unless ref $poster;
% # HERE: The variable is a ref to a given Person.
% $m->comp('.comment', poster => $poster);
% }
</%def>
<%def .comment>
<%args>
$poster => Person->get_anonymous
</%args>
<%init>
# HERE: The variable is now the result of Person->get_anonymous instead.
unless (ref $poster) {
$poster = Person->get_anonymous;
}
</%init>
<p><% $poster->id == 1 ? ' (anonymous)' : $poster->fullname %></p>
</%def>
そのデフォルトを削除しようとしましたが、その場合、空の変数が得られます。
これは、プログラム的に言えば、不可能なことが起こっているように見える数行のコードに至るまで精査された数年前の問題です。Mason のバグの可能性が残っています。または、クラス DBI とデータベースの間のブードゥー教のようなものの組み合わせで、接続が失われたり、$m->comp() についてわからないことがあります。
私が持っている他の唯一の手がかりは、ページに何かを追加したときに、まったく新しい変数に問題が発生したことです。残念ながら、問題がいつ発生するかはわかりません。問題が発生することはめったにないため、提案されたデバッグ コードをそこに投入して、すぐに何かを報告することができません。誰かが同様のことを経験したか、何が起こっているのかを説明する可能性のある問題を知っている可能性が低いことを願っています.