如何使用Perl动态创建HTML表格?

atmip9wb  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(280)

我正在做一个项目,我需要从一个网页URL访问CSV文件。我可以访问该文件,并在终端中打印CSV文件的内容,但我无法生成HTML表(然后我将稍后使用MIME发送电子邮件)。
这里是我的代码-我需要完整的CSV文件作为HTML表传递到我的电子邮件。

#!/usr/bin/perl
use strict;
use warnings;

use LWP::Simple;
use POSIX qw(strftime);
use MIME::Lite;
use Getopt::Long;

my $to="pankajdustbin\@gmail.com";
my $from="pankajdustbin\@gmail.com";
$subject="CSV File";

my $content = `curl -s "https:csvfile.com"`;

@output = split(/\n/,$content);

foreach my $line (@output) {
    my ($col1, $col2, $col3, $col4, $col5, $col6) = split(/,/, $line);
    #print "\n$col1, $col2, $col3, $col4, $col5, $col6\n";

    $message = "<tr> <td>$col1</td> <td>$col2</td> <td>$col3</td> <td>$col4</td> <td>$col5</td> <td>$col6</td></tr>";
}

my $msg=MIME::Lite->new(
        From => $from,
        To => $to,
        Subject => $subject,
        Data => $message
        );

$msg->attr('content-type' => 'text/html');
#MIME::Lite->send("smtp");
$msg->send;

有了这段代码,HTML表格只包含CSV的最后一行。有人能帮我该怎么做吗?
CSV大约有100行,我在终端中看到的示例输出如下:

1.2.3.4  03-04-2022.  03-08-2022. Red.  1%.  Positive
5.2.3.4  03-05-2022.  04-08-2022. Blue.  1%.  Neutral
and so on...
ewm0tg9j

ewm0tg9j1#

问题是每次执行foreach循环时,都要覆盖$message变量的内容,这意味着$message只会得到最后一个赋值。
您可以使用.=运算子附加至变数的内容:

my $message;
foreach my $line (@output) {
    my ($col1, $col2, $col3, $col4, $col5, $col6) = split(/,/, $line);
    $message .= "<tr> <td>$col1</td> <td>$col2</td> <td>$col3</td> <td>$col4</td> <td>$col5</td> <td>$col6</td></tr>";
}
aemubtdh

aemubtdh2#

上一个答案涵盖了您在循环中覆盖了非预期的$message
以下代码片段演示了使用splitfor循环构建html table 的略微不同的方法。
然后,table 可以按您的意愿使用--通过邮件发送或生成 html 页面。在此演示代码中,生成了完整的 html 页面。
注解1:\n\t可选,添加仅用于 html 可读性
注#2:由于未提供样本输入 CVS 文件,因此根据终端中提供的输出假设内容

use strict;
use warnings;
use feature 'say';

my $table = '<table border=1>';

while( my $line = <DATA>) {
    chomp $line;
    $table .= "\n\t\t\t<tr>";
    $table .= "\n\t\t\t\t<td>" . $_ . '</td>' for split(/,/,$line);
    $table .= "\n\t\t\t</tr>";
}

$table .= "\n\t\t</table>";

my $html = 
"<html lang='en'>
    <head>
        <meta charset='utf8' />
        <link rel='stylesheet' href='css/styles.css'>
        <title>
            CVS table
        </title>
    </head>
    <body>
        $table
    </body>
</html>
";

say $html;

__DATA__
1.2.3.4,03-04-2022,03-08-2022,Red,1%,Positive
5.2.3.4,03-05-2022,04-08-2022,Blue,1%,Neutral
1.2.3.4,03-04-2022,03-08-2022,Red,1%,Positive
5.2.3.4,03-05-2022,04-08-2022,Blue,1%,Neutral
1.2.3.4,03-04-2022,03-08-2022,Red,1%,Positive
5.2.3.4,03-05-2022,04-08-2022,Blue,1%,Neutral

相关问题