【问题标题】:splitting an array into variables将数组拆分为变量
【发布时间】:2011-10-02 12:46:04
【问题描述】:

在拆分数组的字段时我很弱(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 ;
}

【问题讨论】:

  • 我必须说我不知道​​你的问题是什么。你写的东西我来回看了一遍,什么也没有。
  • 我知道我需要什么,但我不知道如何解释它 - 数组有数千个元素,但我需要每隔四个元素将其分解并填充一个 html 表。在数组上使用拼接就可以了
  • 我不得不使用这样的东西:while (my \@stat_array_row = splice(\@stat_array_rows, 0, 4)) {
  • 感谢您尝试理解问题。

标签: arrays perl variables split


【解决方案1】:

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

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,但不是@array,他不想要他的原件:($header_host, $header_process, $header_host_region, $stat_host, $stat_process, $stat_region, $stat_message_type) 用于格式化打印吗?另外,使用 Dumper 打印数组 ref 更好还是没有区别?
【解决方案2】:

你应该使用数组数组。

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

【讨论】:

    【解决方案3】:

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

    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. HERE-Docs 使用它们可以更轻松地编写文字多行字符串(您可以在以前的帖子中看到它们)

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

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

    【讨论】:

    • for(my $i = 0; $i
    • @casper:我不确定你想告诉我什么……
    • 很抱歉,我想发表评论,但评论时遇到了问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-18
    • 2013-12-10
    • 1970-01-01
    • 2014-04-23
    相关资源
    最近更新 更多