【问题标题】:Perl <TMPL_LOOP> issueperl <tmpl_loop>问题
【发布时间】:2012-08-19 00:22:15
【问题描述】:

我正在编写一个 Perl 脚本,但我遇到了一个我无法真正克服的问题。这是我的代码:

my @rowses = ();


while ( @list = $sth->fetchrow_array())
{
    %row = ();

    if($list[30] == 1) 
      %row = (
            cod_cliente => $list[1],
            rag_soc => $list[2], 
            p_iva => $list[11],
            IDanagrafica => $list[0],
            tabella => $tab,
            IDanagraficaE => $list[0],
            tabellaE => $tab,
            checkbox => "checked",
            );
    $LOL = \%row;
    print $cgi->p($LOL);
}
else
{
    %row = (
            cod_cliente => $list[1],
            rag_soc => $list[2], 
            p_iva => $list[11],
            IDanagrafica => $list[0],
            tabella => $tab,
            IDanagraficaE => $list[0],
            tabellaE => $tab,
            checkbox => "",
            );
    $LOL = \%row;
    print $cgi->p($LOL);
}

push (@rowses, \%row);
}

 $template->param(table => \@rowses);   
$template->param(tab => $tab);

当我为了调试而尝试打印对一行的引用 ($LOL) 时,它什么也不打印,当我在 @rowses 打印引用时,它是一个充满所有相同哈希的数组,最后一个从语句中获取的。

奇怪的是,如果我每次打印一个哈希行,而不引用它,它会很好地打印它们,并且全部打印出来。

我这样做是为了将包含所有哈希的数组引用传递给 TMPL_LOOP,并打印它们;但它会打印一个仅包含最后一行的长列表。

提前感谢所有帮助我的人。

【问题讨论】:

  • if($list[30] == 1) 之后是否缺少花括号?
  • 您可以通过以下方式简化该条件:%row = (cod_cliente =&gt; ..., tabellaE =&gt; $tab); $row{checkbox} = ($list[30] == 1 ? "checked" : "");

标签: arrays perl templates hash dbi


【解决方案1】:

您的%row 对于while 循环的每次迭代都是同一个变量。您只将引用存储在@rowses 中,这意味着如果您更改%row,所有引用都指向更改后的哈希。您应该为循环的每次迭代定义一个新的%row,例如通过使用

my %row;

没有

%row = ();

为什么不打印 $LOL:如果p 的第一个参数是一个哈希引用,它会被解释为&lt;p&gt; 的属性。

【讨论】:

  • @Snowzurfer:关于my %row%row,您使用的是use strictuse warnings,对吧?
  • @chepner:不,我不是。我在尝试更正另一个人的代码时遇到了这个问题;这就是我遇到麻烦的原因,因为我不是写这篇文章的人。我工作的公司给了我这个任务。
  • @choroba:我会试试你的建议,我会告诉你的
  • @choroba:我已经按照你的建议写了,它奏效了。非常感谢,你对我很有帮助:D
猜你喜欢
  • 2014-12-12
  • 2013-06-08
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2014-06-12
  • 2011-09-12
  • 2010-11-21
  • 1970-01-01
相关资源
最近更新 更多