这是来自其他成功脚本的切片。我需要做的是打印一个<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>
答案 0 :(得分:8)
听起来像List::MoreUtils
'natatime
(n-at-a-time)函数的合适人选:
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";
}
答案 1 :(得分:2)
我的模块List::Gen中的every
函数允许您使用可变步长来遍历任何数组:
my @array = 1..10;
for (every 4 => @array) {
print "@$_\n";
}
打印:
1 2 3 4 5 6 7 8 9 10
与natatime
或拼接数组副本不同,for
循环中的元素是@array
元素的别名,因此如果需要,可以在循环中更改它们
答案 2 :(得分:1)
最简单的解决方案:在for循环中,只要i
成为除0以外的4的倍数而不是数组中的最后一项,就打印</tr><tr>
。
答案 3 :(得分: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);
}
答案 4 :(得分: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";
}