我有几个包含产品安装信息的文件。 我能够从文件中获取我想要的元素(例如,“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是最好的工具吗?
答案 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;
}