子程序无法使用perl cgi将变量置于td标记内?

时间:2017-05-24 10:00:38

标签: perl cgi

在Perl cgi代码的这一部分中$_变量无法使用Perl cgi在<td>标记内打印其内容?

sub do_work {
    my $fh = shift;
    my $content;    

    while ( my $line= <$fh> ) {
        my @name1 = grep {$_ =~ m/^\[/} $line;
        s/\W//g for @name1;
        $content .= join '', @name1;
    }

    return $content;
}

sub do_task {
    my $fh = shift;
    my $load;
    while(my $firstline = <$fh>) {
        $firstline =~ s/.*=//g;
        my @words = split /,., $firstline;
        my $add = 0;
        $load1 .= join("\n", @words);   
    }

    return $load1;  
}

sub layout {
    my ($load, @words = @_;
    my $add = 0;

    print << "EOF";
    <html><body><table>
    <tr>
    <th>s.no</th>
    <th>name</th>
    </tr>
    EOF

    foreach(@words) {
        $add++;
        print<<"EOF"
        <tr>
        <td>$add</td>
        <td>$_</td>
    EOF
    }

    print <<"EOF"
    </table></body></html>
    EOF
}

描述:

  1. 一次又一次地阅读@words我使用了foreach循环。这里从前一个子例程中读取@words。我尝试将相同的数组内容加载到<td>标记中。但是从我的代码来看,它并没有进入foreach?因为没有加载其内容的错误。
  2. 预期产出:

    $load1得到以下输出:

    hardware
    software
    os
    

    所以我试着将它打印在表格中,即在<td>标签内,所以我使用了foreach循环来取默认值。

    现在我希望我的输出应该如下:

    s.no   name
    1      Hardware
    2      Software
    3      os
    

1 个答案:

答案 0 :(得分:1)

HEREDOC的EOF标记需要一直在左边。它不能有前导空格。因此,应该存在语法错误,因为解析器不会将其余代码识别为代码。

看起来应该是这样。

sub layout
{

    my($load)=@_;
    my @words=@_;
    my $add=0;
    print << "EOF";
    <html><body><table>
    <tr>
    <th>s.no</th>
    </tr>
EOF

    foreach(@words)
    {
    $add++;
    print<<"EOF"
    <tr>
    <td>$add</td>
    <td>$_</td>
EOF

    }
    print <<"EOF"
    </table></body></html>
EOF

}

Perl 5.26可能会提供缩进的HEREDOC。随着开发版5.25.7发布了一个新功能,它引入了新的语法<<~"EOF"。但是你可能没有那个版本,或者更新版本。

除此之外,您将函数的第一个参数放在$load中,还放入@words。那可能是错的。那应该是my ($load, @words) = @_