2016-03-04 213 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

這聽起來不像是問題與模板工具包,這聽起來像任何模板引擎的問題。而且,說實話,在使用模板編寫系統十五年以上的時間裏,你不是我以前聽過的任何投訴。通常將顯示邏輯分成不同的文件(或許多文件)是這種方法的一個優點。它允許具有不同技能的人員(前端和後端開發人員)獨立工作在系統的各自部分。 –