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

  • 本文关键字:数组 perl 动态 arrays perl
  • 更新时间 :
  • 英文 :


我有几个文件包含产品安装信息。 我能够从文件中获取我想要的元素(例如,"版本")。我最终得到这样的东西:

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

数组[1] = 实例文件2

array[1][0] = ABC_version=3.4.5

数组[2] = 实例文件3

array[2][0] = XYZ_version=1.1

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

我该怎么做? (我一直只使用 bash 数组和 grep 来做这件事,然后用我的第一个数组重复最初的 grep 输出,然后做另一个 grep 来填充另一个数组 - 但这似乎它正在多次遍历数据,而不是动态构建它。

这个想法是让它按照它所看到的方式构建每个数组。它看到"fileinstance1",它将值存储在该数组的右侧,就像它看到的那样。然后,如果它看到"fileinstance2",它将创建该数组并填充这些值,所有这些都在一次传递中完成。我相信perl是最好的工具吗?

除非你能保证具有相同键的记录彼此相邻,否则从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;
}

最新更新