【问题标题】:Generate array and subarray dynamically (perl)动态生成数组和子数组(perl)
【发布时间】:2017-06-13 15:34:15
【问题描述】:

我有几个包含产品安装信息的文件。 我可以从文件中查找我想要的元素(例如,“版本”)。我最终得到了这样的结果:

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] = instancefile3

array[2][0] = XYZ_version=1.1

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

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

这个想法是让它按照它看到的每个数组来构建它。它看到“fileinstance1”,它将值存储在该数组的右侧,就像它看到的那样。然后,如果它看到“fileinstance2”,它会创建该数组并用这些值填充这些值,这一切都在一次通过。我相信 perl 是最好的工具?

【问题讨论】:

    标签: arrays perl


    【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 2014-11-09
      • 2020-03-02
      • 2015-05-23
      相关资源
      最近更新 更多