Html 如何避免多次打印某些表内容?

Html 如何避免多次打印某些表内容?,html,perl,Html,Perl,我试图通过在Perl脚本中硬编码HTML标记来创建HTML表。我从一个文本文件中获取数据,然后按组件将其拆分,并将其打印到一个HTML表中。文本文件示例(作者、书名、书籍内容): 如何只打印一次作者姓名,而不是打印三次,书名也是如此?只有一位名叫罗尼·史密斯的作者写了三本书,所以这本书应该归为一类。另外,例如javaclasses和javamethods来自同一本书javabook,因此我们应该只打印一次javabook 我的剧本: use strict; use warnings; my $

我试图通过在Perl脚本中硬编码HTML标记来创建HTML表。我从一个文本文件中获取数据,然后按组件将其拆分,并将其打印到一个HTML表中。文本文件示例(作者、书名、书籍内容):

如何只打印一次作者姓名,而不是打印三次,书名也是如此?只有一位名叫罗尼·史密斯的作者写了三本书,所以这本书应该归为一类。另外,例如
javaclasses
javamethods
来自同一本书
javabook
,因此我们应该只打印一次
javabook

我的剧本:

use strict;
use warnings;

my $Author;
my $bookName;
my $bookContent;
my $bookContentList = "List.txt";

open MYFILE, $bookContentList or die "could not open $bookContentList \n";

my @body = "";
push(@body, "<html> \n");
push(@body, "<head> \n");
push(@body, "<TABLE BORDER=\"0\"\n");
push(@body, " <TD>");
push(@body, "<div align=\"left\"><Table border=1 bordercolor= \"black\"> \n");
push(@body, "<tr bgcolor=\"white\"><TH><b>Author</b></TH><TH>Book Name     </TH><TH>bookContent</TH></TR>");
push(@body, "<br>\n");

while (<MYFILE>) {
    ($Author, $bookName, $bookContent) = split(",");
    push(
        @body, "<TR><td>$Author</TD>
         <td>$bookName</TD>
         <td>$bookContent</TD>"
    );
}
push(@body, "</div></Table>");

my $Joining = join('', @body);
push(@body, "</body></font>");
push(@body, "</html>");
my $htmlfile = "compliance.html";
open(HTML, ">$htmlfile") || warn("Can not create file");
print HTML "$Joining";
close HTML;
close MYFILE;
使用严格;
使用警告;
我的$Author;
我的$bookName;
我的$bookContent;
my$bookContentList=“List.txt”;
打开我的文件,$bookContentList或“无法打开$bookContentList\n”;
我的“身体”;
推送(@body,“\n”);
推送(@body,“\n”);
推送(@body,“$htmlfile”)| |警告(“无法创建文件”);
打印HTML“$Joining”;
关闭HTML;
关闭MYFILE;

这是哈希表的经典案例:您希望通过唯一标识符来标识作者和书籍:

my ( %author_books, @author_order );
while (<MYFILE>) {
    ($author, $bookName, $bookContent) = split(",");
    my $auth = $author_books{ $author };
    unless ( $auth ) { 
        push @author_order, $author;
        $author_books{ $author } = $auth = {};
    }
    my $books= $auth->{books}{ $bookName };
    unless ( $books) { 
        push @{ $auth->{order} }, $bookName;
        $auth->{books}{ $bookName } = $books= [];
    }
    push @$books, $bookContent;
}

foreach my $author ( @author_order ) { 
    my $auth  = $author_books{ $author };
    my $books = $auth->{order}; 
    push @body, qq{<tr><td rowspan="${\scalar @$books}">$author</td>\n};
    my $line = 0;
    foreach my $book ( @$books ) { 
        push @body, '<tr><td></td>' if ++$line;
        push @body
           , ( "<td>$book</td><td>"
             . join( "<br/>\n", @{ $auth->{books}{ $book } } )
             . "</td><tr>\n"
             );
    }
}

这样,您也可以避免过早加入
$joining
以及无法像您一样写出页脚的错误。

嘿,谢谢您的回复,但由于某种原因,我在尝试编译时遇到了一个错误。它表示“标量在“$author\n”附近的file.pl中找到了预期的运算符,$”之前缺少运算符,另一个是在opeartor预期的$author\n处找到的字符串”;在$AUTHOR之前找不到接线员。啊,是的。我不能同时使用双引号来分隔整个字符串和属性值分隔符。
my ( %author_books, @author_order );
while (<MYFILE>) {
    ($author, $bookName, $bookContent) = split(",");
    my $auth = $author_books{ $author };
    unless ( $auth ) { 
        push @author_order, $author;
        $author_books{ $author } = $auth = {};
    }
    my $books= $auth->{books}{ $bookName };
    unless ( $books) { 
        push @{ $auth->{order} }, $bookName;
        $auth->{books}{ $bookName } = $books= [];
    }
    push @$books, $bookContent;
}

foreach my $author ( @author_order ) { 
    my $auth  = $author_books{ $author };
    my $books = $auth->{order}; 
    push @body, qq{<tr><td rowspan="${\scalar @$books}">$author</td>\n};
    my $line = 0;
    foreach my $book ( @$books ) { 
        push @body, '<tr><td></td>' if ++$line;
        push @body
           , ( "<td>$book</td><td>"
             . join( "<br/>\n", @{ $auth->{books}{ $book } } )
             . "</td><tr>\n"
             );
    }
}
File::Slurp::write_file( $htmlfile, @body );