在Perl中将Array值彼此相邻

时间:2016-12-03 09:26:36

标签: perl scripting

我有两个数组:@devicedat@timestamp以下方式。

@timestamp

 Nov 20 21:58:41 PST 2016
 Nov 20 21:59:11 PST 2016
 Nov 20 21:59:41 PST 2016

@devicedat

 sda              28.00     0.00 10.00  0.00   156.00     0.00    31.20     0.04    3.70   3.60   3.60
 sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
 sda2             28.00     0.00  4.00  0.00   128.00     0.00    64.00     0.03    6.50   6.50   2.60
 sda3              0.00     0.00  6.00  0.00    28.00     0.00     9.33     0.01    1.83   1.67   1.00
 sdb               0.00     0.00  0.00  2.00     0.00     8.00     8.00     0.00    0.50   0.50   0.10
 sdb1              0.00     0.00  0.00  2.00     0.00     8.00     8.00     0.00    0.50   0.50   0.10
 sdc               0.00     0.00 1351.00  0.00  5404.00     0.00     8.00     0.76    0.56   0.56  76.00
 sdc1              0.00     0.00 1351.00  0.00  5404.00     0.00     8.00     0.76    0.56   0.56  76.00
 sda               0.00     0.00 14.00  0.00    56.00     0.00     8.00     0.01    0.50   0.50   0.70
 sda1              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
 sda2              0.00     0.00  0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
 sda3              0.00     0.00 14.00  0.00    56.00     0.00     8.00     0.01    0.50   0.50   0.70
 sdb               0.00     0.00 89.00  0.00   356.00     0.00     8.00     0.14    1.52   1.52  13.50
 sdb1              0.00     0.00 89.00  0.00   356.00     0.00     8.00     0.14    1.52   1.52  13.50
 sdc               0.00     0.00 513.00  0.00  2052.00     0.00     8.00     0.75    1.45   1.46  74.70
 sdc1              0.00     0.00 513.00  0.00  2052.00     0.00     8.00     0.75    1.45   1.46  74.70

我想将时间戳附加到Perl中的每个磁盘,并需要输出如下:

Nov 20 21:58:41 PST 2016,sda 28.00 0.00 10.00 0.00 156.00 0.00 31.20 0.04 3.70 3.60 3.60
Nov 20 21:58:41 PST 2016, sda1.....
Nov 20 21:58:41 PST 2016, sda2.....
Nov 20 21:58:41 PST 2016, sda3.....
Nov 20 21:58:41 PST 2016, sdb......
Nov 20 21:58:41 PST 2016, sdb1.....
Nov 20 21:58:41 PST 2016, sdc......
Nov 20 21:58:41 PST 2016, sdc1.....
Nov 20 21:59:11 PST 2016, sda......
Nov 20 21:59:11 PST 2016, sda1.....
Nov 20 21:59:11 PST 2016, sda2.....
Nov 20 21:59:11 PST 2016, sda3.....
Nov 20 21:59:11 PST 2016, sdb......
Nov 20 21:59:11 PST 2016, sdb1.....

如何在Perl中以上述方式附加值?我希望附加到所有磁盘的时间戳的值能够以CSV格式解释设备数据。

1 个答案:

答案 0 :(得分:1)

您想要的是Cartesian Product。您必须将每个集合的迭代器嵌套在一起,如下所示:

use strict;
use warnings;

my @timestamp = (
    'Nov 20 21:58:41 PST 2016',
    'Nov 20 21:59:11 PST 2016',
    'Nov 20 21:59:41 PST 2016',
);

my @devicedat = (
    'sda    28.00     0.00   10.00  0.00   156.00     0.00    31.20     0.04    3.70   3.60   3.60',
    'sda1    0.00     0.00    0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00',
    'sda2   28.00     0.00    4.00  0.00   128.00     0.00    64.00     0.03    6.50   6.50   2.60',
    'sda3    0.00     0.00    6.00  0.00    28.00     0.00     9.33     0.01    1.83   1.67   1.00',
    'sdb     0.00     0.00    0.00  2.00     0.00     8.00     8.00     0.00    0.50   0.50   0.10',
    'sdb1    0.00     0.00    0.00  2.00     0.00     8.00     8.00     0.00    0.50   0.50   0.10',
    'sdc     0.00     0.00 1351.00  0.00  5404.00     0.00     8.00     0.76    0.56   0.56  76.00',
    'sdc1    0.00     0.00 1351.00  0.00  5404.00     0.00     8.00     0.76    0.56   0.56  76.00',
    'sda     0.00     0.00   14.00  0.00    56.00     0.00     8.00     0.01    0.50   0.50   0.70',
    'sda1    0.00     0.00    0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00',
    'sda2    0.00     0.00    0.00  0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00',
    'sda3    0.00     0.00   14.00  0.00    56.00     0.00     8.00     0.01    0.50   0.50   0.70',
    'sdb     0.00     0.00   89.00  0.00   356.00     0.00     8.00     0.14    1.52   1.52  13.50',
    'sdb1    0.00     0.00   89.00  0.00   356.00     0.00     8.00     0.14    1.52   1.52  13.50',
    'sdc     0.00     0.00  513.00  0.00  2052.00     0.00     8.00     0.75    1.45   1.46  74.70',
    'sdc1    0.00     0.00  513.00  0.00  2052.00     0.00     8.00     0.75    1.45   1.46  74.70',
);

my @product = ();
for my $timestamp ( @timestamp ){
    for my $devicedat ( @devicedat ){
        push @product, "$timestamp, $devicedat";
    }
}

print "$_\n" for @product;

有关Cartesian Product in Perl的更多详情。