将数组拆分为变量

时间:2011-07-11 05:29:08

标签: arrays perl variables split

在分割数组的字段时我很弱(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 个答案:

答案 0 :(得分:5)

如果我理解正确,你的问题是你不知道如何分割这些字符串 - 这是这样做的:

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 :(得分:1)

你应该使用一组数组。

#!/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 \@$_;
}

答案 2 :(得分:1)

我不确定我是否理解你的问题,但如果你想知道如何将七个数组字段提取到变量,这应该有效:

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"
}

btw:想到

  1. ... HERE-Docs 使用它们可以更轻松地编写文字多行字符串(您可以在之前的帖子中看到它们)

  2. ...使用更好的数据结构,例如哈希列表

  3. ...正确格式化你的代码,你的字符串文字已经用点分隔,为什么不在那里添加换行符?