我有一个 perl mason 组件,它被调用来显示一个包含线程注释的 html 页面。它使用 DBI 类从 MySQL 数据库加载。
问题是有时,我的意思是有时,变量在代码中途非常不规则地失去它的值。我不会在它开始和停止发生之间更改代码,只是重新加载页面。它甚至不只是在一个页面加载而不是下一个页面上具有价值。这是在一个页面加载时,您可以打印一些内容以显示该变量包含对对象的引用(具有名称的“Person”等),稍后在同一页面加载的代码中,您可以再次打印它并且表明它没有。在下一页加载时,变量可能会一直保持其值。唯一发生的事情是变量通过对 $m->comp() 的调用传递,如果它为空,则应用默认值。
此外,每条评论都会发生这种情况,在同一页面加载中多次有效地失去其价值。
不幸的是(或者幸运的是,取决于你如何看待它)我不能逐字发布所有涉及的代码,但它归结为以下内容,请注意标记为“HERE”的两条注释行:
<%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() 的东西。
我唯一的其他线索是,当我向页面添加一些内容时,我的问题出现在一个全新的变量上。不幸的是,我永远不知道问题何时会发生,而且这种情况很少发生,以至于我无法将一些建议的调试代码投入其中,这将立即给我一些反馈。我只希望有人经历过类似的事情或知道一些可能的问题来解释正在发生的事情。