разбиение массива на переменные - PullRequest
0 голосов
/ 11 июля 2011

Я слаб, когда дело доходит до разбиения полей массива (array[0] - array[6]) wal в переменные в Perl

Это конец большой программы - результаты закачиваются в массив, а затем отправляются по электронной почте в табличном формате - массив, который выкачивается, выглядит как статический @mailarray ниже. Таблица корректно форматируется в электронном письме, она просто выкачивает одну и ту же строку - для каждой строки массива. Необходимо пройти весь массив по 7 полей к каждой строке.

mrktsrvr:ltick Chicago tkscan100:tmscn-Brooklyn OCOMsg2
mrktsrvr:ltick Chicago tkscan100:tmscn-Brooklyn OCOMsg2
mrktsrvr:ltick Chicago tkscan100:tmscn-Brooklyn OCOMsg2
mrktsrvr:ltick Chicago tkscan100:tmscn-Brooklyn OCOMsg2
mrktsrvr:ltick Chicago tkscan100:tmscn-Brooklyn OCOMsg2
mrktsrvr:ltick Chicago tkscan100:tmscn-Brooklyn OCOMsg2

Конец программы выглядит так:

#!/usr/bin/perl

@mailarray = qw(mrktsrvr ltick Chicago tkscan100 tmscn Brooklyn OCOMsg2
mrktsrvr ltick Chicago ctdb811 dltic080 Brooklyn OCOMsg2
mrktsrvr ltick Chicago farm101 bhsrv0 Brooklyn OCOMsg2
mrktsrvr ltick Chicago farm102 bhsrv0 Brooklyn OCOMsg2
mrktsrvr ltick Chicago rnds110 nictsrv1 Brooklyn OCOMsg2
mrktsrvr ltick Chicago relay11 tryticUS1 Brooklyn OCOMsg2);
($header_host, $header_process, $header_host_region, $stat_host, $stat_process, $stat_region, $stat_message_type)=@mailarray;
print $header_host;
print "@mailarray\n";
if (@mailarray){
  #open(MAIL,"| /usr/sbin/sendmail -t") || warn "Can't send email\n";
  print  "to:casper\@mail\n";
  print  "from: $header_host\n";
  print  "Subject: ping_stat for $header_host $yyyymmdd\n";
  print  "Content-type: text/html\n\n";
  print  "<html><body><center><b>ping_stat messaging violations for $header_host $yyyymmdd</b>\n";
  print  "<table border=1><tr><td>Process</td><td>Acceptable Regions</td><td>Violation of Region</td><td>Message Type</td></tr>\n";
  foreach (@mailarray){
        ($header_host, $header_process, $header_host_region, $stat_host, $stat_process, $stat_region, $stat_message_type)=@mailarray;
#split(/\s+/, $_);
        print  "<tr><td>$header_process" . ":" . "$header_process</td><td>$header_host_region</td><td>$stat_host" .":". "$stat_process" . "-" . "$stat_region</td><td>$stat_message_type</td></tr>\n";
  }
  print  "</table>\n";
  print  "<br><br>\n";
  print "</table></center></body></html>";
  close ;
}

Ответы [ 3 ]

5 голосов
/ 11 июля 2011

Если я правильно понимаю, ваша проблема в том, что вы не знаете, как разбить эти строки - это делает это:

use strict;
use warnings;
use Data::Dumper;

my $str = <<END
mrktsrvr:ltick Chicago tkscan100:tmscn-Brooklyn OCOMsg2
mrktsrvr:ltick Chicago tkscan100:tmscn-Brooklyn OCOMsg2
mrktsrvr:ltick Chicago tkscan100:tmscn-Brooklyn OCOMsg2
mrktsrvr:ltick Chicago tkscan100:tmscn-Brooklyn OCOMsg2
mrktsrvr:ltick Chicago tkscan100:tmscn-Brooklyn OCOMsg2
mrktsrvr:ltick Chicago tkscan100:tmscn-Brooklyn OCOMsg2
END
;

foreach my $line ( split( /\n/, $str ) ){
    my @array = split( /\W/, $line);
    print Dumper(\@array);
}
1 голос
/ 12 июля 2011

Я не уверен, что понимаю ваш вопрос, но если вы хотите узнать, как извлечь семь полей массива в переменные, это должно сработать:

for(my $i = 0; $i < @mailarray; $i += 7){
 my ($header_host, $header_process, $header_host_region, 
     $stat_host, $stat_process, $stat_region, 
     $stat_message_type) = @mailarray[$i..$i+7];
     print "&lt;tr&gt;&lt;td&gt;$header_process:" .
       "$header_process&lt;/td&gt;&lt;td&gt;".
       "$header_host_region&lt;/td&gt;&lt;td&gt;$stat_host".
       ":$stat_process"."-"."$stat_region&lt;/td&gt;&lt;td&gt;".
       "$stat_message_type&lt;/td&gt;&lt;/tr&gt;\n"
}

кстати: думать о

  1. ЗДЕСЬ-Документы их использование значительно упрощает написание буквенных многострочных строк (вы можете увидеть их в предыдущем посте)

  2. … используя лучшую структуру данных, например, Список хэшей

  3. … правильное форматирование кода, строковые литералы уже разделены точками, почему бы не поставить туда новую строку?

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

Вы должны были использовать массив массивов.

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;

my @mailarray = (
    [qw/ mrktsrvr ltick Chicago tkscan100 tmscn Brooklyn OCOMsg2 /],
    [qw/ mrktsrvr ltick Chicago ctdb811 dltic080 Brooklyn OCOMsg2 /],
    [qw/ mrktsrvr ltick Chicago farm101 bhsrv0 Brooklyn OCOMsg2 /],
    [qw/ mrktsrvr ltick Chicago farm102 bhsrv0 Brooklyn OCOMsg2 /],
    [qw/ mrktsrvr ltick Chicago rnds110 nictsrv1 Brooklyn OCOMsg2 /],
    [qw/ mrktsrvr ltick Chicago relay11 tryticUS1 Brooklyn OCOMsg2 /],
);

for (@mailarray) {
    print Dumper \@$_;
}
...