子例程无法使用perl cgi获取td标记内的变量?

子例程无法使用perl cgi获取td标记内的变量?,perl,cgi,Perl,Cgi,在Perl cgi代码的这一部分中,变量未能使用Perl cgi打印标记内的内容 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;

在Perl cgi代码的这一部分中,变量未能使用Perl cgi打印标记内的内容

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
}
所以我尝试在表中打印它,即在标记内部,所以我使用了foreach循环来获取默认值

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

s.no   name
1      Hardware
2      Software
3      os
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

}

Perl5.26可能提供缩进的HEREDOCs。开发版本发布了一个新特性,在缩进后引入了新语法。我也发现了同样的问题@simbabqueadded expected output@simbabquewhy在foreach循环中未关闭@simbabque@insite因为我是从问题中抄来的,它也不见了@insite我和其他人都在对这个问题的评论中要求您至少编译那里的代码,并包含示例输入。如果你不这样做,我们就不会帮助你,因为我们不能。你可能认为这只是一个例子,所以这不重要,但它确实重要。大多数情况下,当你试图将问题简化为一个最小的例子时,你会自己发现问题。问题往往不在你认为的地方。我愿意免费帮助你,在我的休假日,我的国家今天有一个银行假期,但前提是你也帮忙。这不是你真正的代码。它有语法错误。请包括你的真实代码!当你在做这件事的时候,也请包括一些例子数据来重现这个问题,并解释你期望的输出。真正的代码太大了,这就是为什么我在代码中添加了显示问题的部分@Simbabques增加了预期输出@Simbabquen你的缩进很糟糕,你的大括号位置不一致。如果你想让人们阅读和理解你的代码,请花点时间让它尽可能容易阅读。我知道你的代码太大,无法共享。但是你给我们的代码至少应该编译。为了使代码更具可读性,我刚刚检查了代码,发现至少有两行有明显的语法错误——my@words=split/,,,$firstline;还有我的$load,@words=@;。如果你不能花时间让你的代码甚至可以编译,那么我们为什么要花时间看它呢?
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

}