如何动态创建名称从源数据生成的数组?

时间:2017-05-29 23:11:46

标签: arrays perl

我正在处理一个C ++文件。最初我使用反引号将终端结果存储到一个数组中。我的终端结果如下,它根据C文件而有所不同。在这种情况下,我只有3个TAP1前缀:TAP2TAP3TAP。对于某些C ++文件,TAP1= 0 TAP1= 0 TAP1= 0 TAP2= 0 TAP1= 0 TAP3= 0 TAP1= 0 TAP1= 0 TAP2= 0 TAP1= 144 TAP1= 1300 TAP3= 2795 TAP1= 2963 TAP1= 3031 TAP2= 3291 TAP3= 16395 TAP1= 16699 TAP1= 16711 TAP2= 71 TAP1= 36 TAP2= 2994 TAP1= 6634 TAP2= 6769 TAP1= 6837 TAP1= 7233 TAP2= 10985 TAP1= 1103 计数可能超过10(这是非确定性的)。

@tap = (TAP1, TAP2, TAP3)

对于上述情况,我的数组是my @store_taps; foreach my $a (@lines) { if ($a =~ m/(.*)=(.*)/g) { push(@store_taps, $1); } } 。这将自动存储如下:

TAP

我的问题是如何为每个@TAP1 = (0, 0, 0, 144, 1300, ...)声明一个数组并自动存储相应的值。 @TAP2 = (0, 0, 3291, 71, ...)@TAP3 = (0, 0, 2795, ...)id。我不知道如何自动生成这些数组。

2 个答案:

答案 0 :(得分:0)

不,你需要哈希。

my %tap_for; for my $l (@lines) { chomp $l; # if you haven't already my ($tap, $val) = split /=/, $l, 2; push @{$tap_for{$tap}}, $val; }

您可以一次性完成所有这些操作。比你正在寻找的方法简单得多,而且你不必创建你需要动态查找其名称的任意变量。

答案 1 :(得分:-1)

您可能需要一个哈希,其中键为TAPn,值为数组引用。

use strict;
use warnings;

use Data::Dumper;

my %data;

while (<DATA>) {
    chomp;
    my ($key, $val) = split/\s*=\s*/;
    push(@{$data{$key}}, $val);
}

print Dumper(\%data);

__DATA__
TAP1= 0
TAP1= 0
TAP1= 0
TAP2= 0
TAP1= 0
TAP3= 0
TAP1= 0
TAP1= 0
TAP2= 0
TAP1= 144
TAP1= 1300
TAP3= 2795
TAP1= 2963
TAP1= 3031
TAP2= 3291
TAP3= 16395
TAP1= 16699
TAP1= 16711
TAP2= 71
TAP1= 36
TAP2= 2994
TAP1= 6634
TAP2= 6769
TAP1= 6837
TAP1= 7233
TAP2= 10985
TAP1= 1103

输出:

$VAR1 = {
          'TAP2' => [
                      '0',
                      '0',
                      '3291',
                      '71',
                      '2994',
                      '6769',
                      '10985'
                    ],
          'TAP3' => [
                      '0',
                      '2795',
                      '16395'
                    ],
          'TAP1' => [
                      '0',
                      '0',
                      '0',
                      '0',
                      '0',
                      '0',
                      '144',
                      '1300',
                      '2963',
                      '3031',
                      '16699',
                      '16711',
                      '36',
                      '6634',
                      '6837',
                      '7233',
                      '1103'
                    ]

    };