Как я могу зациклить список из четырех элементов одновременно? - PullRequest
2 голосов
/ 24 июля 2011

Это фрагмент успешного сценария. Что мне нужно сделать, это напечатать один <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 ]

8 голосов
/ 24 июля 2011

Звучит как хороший кандидат для функции 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";
}
2 голосов
/ 25 июля 2011

Функция every из моего модуля List :: Gen позволяет вам обходить любой массив с переменным размером шага:

my @array = 1..10;

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

, который печатает:

1 2 3 4
5 6 7 8
9 10

В отличие от natatime или сращивания копии массива, элементы в цикле for привязаны к элементам @array, поэтому вы можете изменить их в цикле, если вам нужно.

1 голос
/ 24 июля 2011

Прежде всего вам вообще не нужен внешний цикл, так как условие:

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 голос
/ 24 июля 2011

Другой способ:

# 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";
}
1 голос
/ 24 июля 2011

Самое простое решение: внутри цикла for всякий раз, когда i становится кратным 4, отличным от 0 и отличным от последнего элемента в массиве, выведите </tr><tr>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...