Perl变量执行顺序

Perl variables order of execution

我正在基于表单从 SQLite 数据库中读取一些值

my $Fruits= $FORM{Fruits}; 
my $FruitsTable =0; 

一旦我从数据库中获取值,它们应该存储在一个名为 my $SelectedFruits 的变量中。

while ( my @column = $sth->fetchrow_array() ) {

    $FruitsTable = 1;

    # Within the table there is a row called Tropical which contains bananas, guaves and oranges. I want to select bananas and guaves
    my $SelectedFruits = print "<tr>
                           <td>$Tropical[0]</td>
                           <td>$Tropical[1]</td>
                     </tr>";
}

如果找到,应该打印一个 table 我的选择(我的问题是打印顺序):

if ( $FruitsTable == 1 ) {

    print "<table>
            <thead>
              <tr>
                <th>Bananas</th>
                 <th>Guave</th>
              </tr>
           </thead>
        <tbody>";

    $SelectedFruits;

    print "</tbody></table>";
}

代码退出没有错误。

这里的问题是先打印$bananas,然后打印table的页眉和页脚,所以table看起来很疯狂。

如何先打印 table 的页眉,然后打印 $bananas,然后再打印 table 的页脚?

必须始终 use strictuse warnings 'all' 每个 你写的Perl程序。这个问题对你有很大帮助

问题是这个

my $bananas = print "<tr>
    <td>$happyBananas[0]</td>
    <td>$hippieBananas[1]</td>
</tr>";

会立即打印table行,设置词法变量$bananas为1(print的return代码)然后在最后扔掉循环

你想要这样的东西,它将 table 的内容累积到 non-local 变量 $bananas_rows 而不是打印它,然后也可以作为flag判断是否有table打印

请注意,我使用了 "here documents",它会弄乱缩进,但比裸双引号更具可读性

my $bananas_rows; # Don't initialise variables without a reason

while ( my @column = $sth->fetchrow_array() ) {

    $bananas_rows .= <<END_HTML;
<tr>
    <td>$happyBananas[0]</td>
    <td>$hippieBananas[1]</td>
</tr>
END_HTML

}

  if ( $bananas_rows == 1 ) {

   print <<END_HTML;
<table>
  <thead>
    <tr>
      <th>Happy Bananas</th>
      <th>Hippie Bananas</th>
    </tr>
  </thead>
  <tbody>
END_HTML

    print $bananas_rows;

    print "</tbody></table>"; 

}