2011-07-24 32 views
2

這是從另一個成功的腳本切片。我需要做的是打印一個<tr>,然後打印<td>$stat_array</td>四次,退出,打印一個</tr>然後打印另一個<tr>,打印下面四個$stat_arrays,@stat_array,依此類推,然後</table>我該如何循環一次列出四個元素?

它所做的是打印所有八個$start_arrays然後一個</tr>

my @table_header = ("Process", "Region_Permission","Region Violation","Message Type"); 
my @stat_array =("ibfarm102 - localtick" ," Greenwich" ," hibmis100 - procHKHD2 -  Hongkong" , "PidMonRsp" ," ibfarm102 - localtick", "Greenwich" ,"hibmis100 -  procHKHD2 - Hongkong", "PidMonReq"); 

print MAIL "<tr>\n"; 

for ($i = 0 ; $i <$#table_header ; $i = $i + $#table_header) { 
    foreach my $stat_array(@stat_array) { 
     print MAIL "<td>$stat_array</td>\n"; 
    } 

    print MAIL "</tr>\n"; 
} 
print MAIL "</table>\n"; 
print MAIL "<br><br>\n"; 
print MAIL "</table></center></body></html>"; 
close MAIL; 

我得到什麼:

<tr> 
<td>ibfarm102 - localtick </td> 
<td> Greenwich</td> 
<td> hibmis100 - procHKHD2 - Hongkong </td> 
<td>PidMonRsp</td> 
<td>ibfarm102 - localtick </td> 
<td> Greenwich</td> 
<td> hibmis100 - procHKHD2 - Hongkong </td> 
<td>PidMonReq</td> 
</tr> 

我需要的表看起來像:

<tr> 
<td>ibfarm102 - localtick </td> 
<td> Greenwich</td> 
<td> hibmis100 - procHKHD2 - Hongkong </td> 
<td>PidMonRsp</td> 
</tr> 
<tr> 
<td>ibfarm102 - localtick </td> 
<td> Greenwich</td> 
<td> hibmis100 - procHKHD2 - Hongkong </td> 
<td>PidMonReq</td> 
</tr> 

回答

1

最簡單的辦法:內部的for循環,每當i已成爲4的倍數除了0和數組中的最後一項以外,請輸入</tr><tr>

1

首先你不需要外循環,因爲在所有的條件:

for ($i = 0 ; $i <$#table_header ; $i = $i + $#table_header) 

將只執行包含塊只有一次!我們每月的第四個元素@stat_array與"<tr>"分開,簡單地做到這一點:

for ($i = 0; $i < $#stat_array; ++$i) { 
     print MAIL "<td>$stat_array[$i]</td>\n"; 
     print MAIL "<tr>" if ($i % 4 == 0); 
} 
1

另一種方式:

# make a copy of the stats if you need the original array left intact 
my @stat_array_rows = @stat_array; 
while (my @stat_array_row = splice(@stat_array_rows, 0, 4)) { 
    print MAIL "<tr>\n"; 
    for my $stat (@stat_array_row) { 
     print MAIL "<td>$stat</td>\n"; 
    } 
    print MAIL "</tr>\n"; 
} 
+0

拼接陣列工作 - 謝謝。 – capser

8

聽起來像是不錯的候選人List::MoreUtilsnatatime(N-AT-A-時間)功能:

use strict; 
use warnings; 
use List::MoreUtils 'natatime'; 

my $four_at_a_time = natatime 4, @stat_array; 
my $string_to_print = "<html><body><center><table>\n"; 

while (my @four = $four_at_a_time->()) { 

    $string_to_print .= join "\n", "<tr>", 
            map { "<td>" . $_ . "</td>" } @four, 
            "</tr>\n"; 
} 
2

從我模塊List::Genevery功能可以讓你走任何陣列具有可變步長:

my @array = 1..10; 

for (every 4 => @array) { 
    print "@$_\n"; 
} 

它打印:

 
1 2 3 4 
5 6 7 8 
9 10 

不同於natatime或剪接陣列的一個副本,在for環路之元件被混疊到的@array的元素,因此可以在循環,如果改變它們你需要。

相關問題