我有一个perl mason组件,调用它来显示包含线程注释的html页面。它使用Class DBI从MySQL数据库加载。
问题在于,有时,我的意思是,非常不正常变量在代码中途丢失了它的值。我没有在启动和停止发生之间更改代码,只是重新加载页面。它甚至没有在一个页面加载而不是下一个加载的价值。在一个页面上加载你可以打印一些东西来显示变量包含一个对象的引用(一个" Person"有一个名字等),然后在那个代码中相同的页面加载,您可以再次打印,并表明它没有。在下一页加载时,变量可以一直保持其值。唯一发生的事情是变量通过调用$ m-> comp()传递,如果它是空的,则应用默认值。
此外,它发生在每一条评论中,在同一页面加载中多次失去其价值。
不幸的是(或者幸运的是,取决于你如何看待它)我无法逐字发布所有相关代码,但归结为以下内容,请注意标记为" HERE&#34的两条注释行;:
<%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-&gt; comp()的东西
我唯一的另一个线索是,当我在页面上添加了一些内容时,我已经将问题显示为一个全新的变量。不幸的是,我从来不知道问题什么时候会发生,并且它很少发生,我很快就能把一些建议的调试代码扔进去,这会立即给我一些报告的东西。我只是希望有人遇到过类似的事情,或者知道一些可能解释正在发生的事情的可能问题。