2011-07-24 31 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的元素,因此可以在循环,如果改变它们你需要。

相关问题