如何一次循环列表四个元素?

时间:2011-07-24 17:27:24

标签: perl loops

这是来自其他成功脚本的切片。我需要做的是打印一个<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>

5 个答案:

答案 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";
}