如何使用Perl动态生成HTML表格 解决CSV转表格仅显示末行问题
问题原因
- 核心错误:遍历CSV每一行的循环中,每次都直接给
$message变量重新赋值,没有拼接历史内容,循环执行完后变量只会保留最后一行的内容。 - 其余会导致功能异常的问题:
- 开启
use strict严格模式后,$subject、@output、$message等变量未通过my声明,运行时会直接抛出语法错误 - 生成的表格行片段没有外层
<table>标签包裹,邮件客户端无法正常渲染为标准表格 - 你提供的CSV示例实际为多空格分隔格式,原代码用逗号作为分隔符无法正确拆分每列内容
- 已经引入
LWP::Simple网络请求模块,无需额外调用系统curl命令拉取文件,使用模块原生方法兼容性更好 - 未指定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"; my $subject = "CSV File"; # 替换为实际CSV文件的URL地址 my $content = get("https://csvfile.com/actual-csv-path"); die "拉取CSV文件失败" unless defined $content; my @output = split(/\n/, $content); # 初始化表格,添加基础边框、内边距样式提升邮件里的可读性 my $message = "<table border='1' cellpadding='6' cellspacing='0'>"; foreach my $line (@output) { chomp $line; next if $line =~ /^\s*$/; # 跳过空行 # 分隔符根据实际CSV格式选择:逗号分隔用下一行注释的写法,多空格分隔用当前写法 # my ($col1, $col2, $col3, $col4, $col5, $col6) = split(/\s*,\s*/, $line); my ($col1, $col2, $col3, $col4, $col5, $col6) = split(/\s{2,}/, $line); # 用 .= 操作符拼接每一行的表格内容,而非直接覆盖 $message .= "<tr> <td>$col1</td> <td>$col2</td> <td>$col3</td> <td>$col4</td> <td>$col5</td> <td>$col6</td> </tr>"; } $message .= "</table>"; # 闭合表格标签 my $msg = MIME::Lite->new( From => $from, To => $to, Subject => $subject, Data => $message ); # 设置HTML内容类型并指定UTF-8编码,避免乱码 $msg->attr('content-type' => 'text/html; charset=utf-8'); # 需要走指定SMTP服务发信时,解开下方注释并配置对应邮箱的SMTP参数 # MIME::Lite->send("smtp", "你的SMTP服务器地址", Port => 465, AuthUser => $from, AuthPass => "你的邮箱授权码"); $msg->send;
注意:如果你的CSV内容里存在包含逗号的字段(比如引号包裹的文本列),不要自己手写split逻辑,引入Text::CSV模块解析CSV会更严谨,避免列拆分错位。
内容的提问来源于stack exchange,提问作者Pankaj Kumar
相关产品推荐
相关产品推荐

