动态生成数组和子数组(perl)

时间:2017-06-13 15:34:15

标签: arrays perl

我有几个包含产品安装信息的文件。 我能够从文件中获取我想要的元素(例如,“version”)。我最终得到了类似的东西:

instancefile1:ABC_version=1.2.3 
instancefile1:XYZ_version=2.5 
instancefile2:ABC_version=3.4.5 
instancefile3:XYZ_version=1.1

组件名称为ABC或XYZ。

我想做的是获取这个grep输出并通过perl解析它以在文件上构建数组。 第一个数组将由实例编号组成(从文件名中提取) - 上面,我有一个数组,其中有1,2,3个元素。

在每个数组中都有特定实例所拥有的组件。

以上完整的预期数组和组件:

  

array [0] = instancefile1#可以保存此名称,如文件名,   或指定名称。没关系

 array[0][0] = ABC_version=1.2.3
 array[0][1] = XYZ_version=2.5
     

array [1] = instancefile2

array[1][0] = ABC_version=3.4.5
     

array [2] = instancefile3

array[2][0] = XYZ_version=1.1

(我知道我引用子数组的符号不正确 - 我的perl上生锈了。)

我该怎么做? (我一直在用bash数组和grep做这个,然后通过我的第一个数组重复初始grep输出并再做一个grep来填充另一个数组 - 但这似乎是它经历了多次数据,而不是在飞行中建立它。)

我们的想法是在它看到它时构建每个数组。它看到“fileinstance1”,它将值存储在该数组的右侧,就像它看到的那样。然后,如果它看到“fileinstance2”,它会创建该数组并使用这些值进行填充,所有这些都在一次传递中。我相信perl是最好的工具吗?

1 个答案:

答案 0 :(得分:1)

除非您能保证具有相同密钥的记录将彼此相邻,否则从HoA开始会更容易。

my %data;
while (<>) {
   chomp;
   my ($key, $val) = split /:/;
   push @{ $data{$key} }, $val;
}

然后转换为AoA:

my @data = values(%data);

保序:

my %data;
my @data;
while (<>) {
   chomp;
   my ($key, $val) = split /:/;
   push @data, $data{$key} = []
      if !$data{$key};

   push @{ $data{$key} }, $val;
}