我正在处理一个C ++文件。最初我使用反引号将终端结果存储到一个数组中。我的终端结果如下,它根据C文件而有所不同。在这种情况下,我只有3个TAP1
前缀:TAP2
,TAP3
和TAP
。对于某些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
。我不知道如何自动生成这些数组。
答案 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'
]
};