2016-03-04 105 views
-1

我试图以表格格式对齐两个数组的内容并发送电子邮件。但是表格中的第二列没有按照需要对齐。第二列的内容显示为单行。HTML表格格式问题

我附加输出表,以及:

#!/usr/bin/perl 

use strict; 
use warnings; 

use MIME::Lite; 
use HTML::Entities; 

my $msg; 
my @Sucess = qw(s1 s2 s3 s4 s5 s6); 
my @Failed = qw(f1 f2 f3 f4); 

my $html = '<table style="width:600px;margin:0 100px" border="1" BORDERCOLOR="#000000"> 
    <thead><th bgcolor="#9fc0fb">Successful</th><th bgcolor="#9fc0fb">Failed</th></thead> 
    <tbody>';  

$html .= "<tr><td>$_</td>" for @Sucess; 
$html .= "<td>$_</td>" for @Failed; 
$html .= " </tr>"; 


$msg = MIME::Lite->new(
    from => '[email protected]', 
    To  => '[email protected]', 
    Subject => 'Status of Update', 
    Type => 'multipart/related' 
); 

$msg->attach(
    Type => 'text/html', 
    Data => qq{ 
     <body> 
     <html>$html</html> 
     </body> 
    }, 
); 

MIME::Lite->send ('smtp','xyz.global.abc.com'); 
$msg->send; 

Output Table

+0

soooo ...你不相信结束标签? '':P – SpYk3HH

+0

您可以自由使用任何在Perl中有效的标识符,但熟悉该语言的人以及其他不熟悉英语的人会感谢您使用'snake_case'作为局部变量。首字母大写字母是一个特殊的问题,因为语言本身保留了诸如包名等全局标识符的名称。看起来你不需要在@ @ success和@ @失败时使用'@ Sucess'和'@ Failed' – Borodin

回答

1

首先,你遍历每个项目在@Sucess并为每一个你:

  • 创建一个新的行
  • 在该行创建一个单元格
$html .= "<tr><td>$_</td>" for @Sucess; 

那你看看在每个项目中@Failed并为每一个你:你创建

  • 的最后一行创建一个细胞(为最近@Sucess
$html .= "<td>$_</td>" for @Failed; 

最后,明确关闭最后创建的表行:

$html .= " </tr>"; 

为了得到你的愿望,你需要按行工作列上的布局(这是明显的非表格)。你无法处理所有的@Sucess,然后所有的@Failed

my @Sucess= qw(s1 s2 s3 s4 s5 s6); 
my @Failed= qw(f1 f2 f3 f4); 

my $html = "<table>\n"; 

do { 
    my $s = shift @Sucess; 
    my $f = shift @Failed; 
    $html .= sprintf("<tr> <td> %s </td> <td> %s </td> </tr> \n", map { $_ // '' } $s, $f); 
} while (@Sucess or @Failed); 

$html .= "</table>"; 

print $html; 
2

您需要将构建表的代码替换为按逻辑顺序工作的代码。 HTML表格需要逐行定义。你不能处理所有的成功,然后处理所有的失败。

我会像这样的东西代替的代码的中间部分:

use List::Util qw[max]; 

my $max = max($#Sucess, $#Failed); 

for (0 .. $max) { 
    $html .= '<tr><td>'; 
    $html .= $Sucess[$_] // ''; 
    $html .= '</td><td>'; 
    $html .= $Failed[$_] // ''; 
    $html .= "</td></tr>\n"; 
} 

但实际上,我永远不会把原始的HTML在Perl程序。改为使用templating system

+0

* Template Toolkit *的问题是人们看到他们的依赖和标识符(主要是'类的字符串)遍布多个文件,它需要一个非常好的IDE来跟踪它们。尽管可以将模板放入程序的“DATA”部分,但在模块中这种方法有点奇怪,并且每个源文件只能提供一个模板。这可以用[Data :: Section](http://metacpan.org/module/Data::Section)之类的东西笨拙地克服,但更少的措施让我们挣扎着多个全局标识符 – Borodin

+1

这听起来不像是问题与模板工具包,这听起来像任何模板引擎的问题。而且,说实话,在使用模板编写系统十五年以上的时间里,你不是我以前听过的任何投诉。通常将显示逻辑分成不同的文件(或许多文件)是这种方法的一个优点。它允许具有不同技能的人员(前端和后端开发人员)独立工作在系统的各自部分。 –