【问题标题】:Perl 2D array comparison issuesPerl 二维数组比较问题
【发布时间】:2013-01-10 06:13:24
【问题描述】:

我正在编写一个 perl 脚本,它审核一个库并将已安装软件的列表与另一台机器的列表进行比较,以确保它们使用相同的东西。我已获取原始数据并将其放入大小为Nx4 的两个二维数组中,其中 N 是软件标题的数量。例如:

[Fileset1], [1.0.2.3], [COMMITTED], [Description of file]
[Fileset2], [2.4.2.2], [COMMITTED], [Description of a different file]
....

我现在需要比较这两个列表以找出差异,它们是否缺少级别差异的文件。还不是 perl 专业人士,我能想到的唯一方法是将第一个数组的每个元素与另一个数组的每个元素进行比较,以首先查找具有不同级别的匹配文件集或根本没有匹配的文件集。我必须用另一个列表重复这个过程,以确保我找到了所有可能的差异。显然,通过这个程序,我正在寻找大于 n^2 的效率。我想知道在比较具有超过 20,000 个条目的库时,是否可以使用 grep 的某些应用程序或类似的东西来避免这种情况。

简而言之,我需要比较两个二维数组并跟踪每个列表的差异,而不是仅仅找到两者的交集。

提前感谢您的帮助!

【问题讨论】:

    标签: performance perl multidimensional-array


    【解决方案1】:

    输出有点笨拙,但我喜欢Data::Diff 用于这样的任务:

    use Data::Diff 'Diff';
    use Data::Dumper;
    
    @a = ( ["Fileset1", "1.0.2.3", "COMMITTED", "Description of file" ],
           ["Fileset2", "2.4.2.2", "COMMITTED", "Description of a different file" ],
           ["Fileset3", "1.2.3.4", "COMMITTED", "Description of a different file" ] );
    
    @b = ( ["Fileset1", "1.0.2.3", "COMMITTED", "Description of file" ],
           ["Fileset2", "2.4.2.99", "COMMITTED", "Description of a different file" ] );    
    
    $out = Diff(\@a,\@b);    
    print Dumper($out);
    

    结果:

    $VAR1 = {
      'diff' => [
        {
          'uniq_a' => [
            '2.4.2.2'
          ],
          'same' => [
            {
              'same' => 'COMMITTED',
              'type' => ''
            },
            {
              'same' => 'Description of a different file',
              'type' => ''
            },
            {
              'same' => 'Fileset2',
              'type' => ''
            }
          ],
          'type' => 'ARRAY',
          'uniq_b' => [
            '2.4.2.99'
          ]
        }
      ],
      'uniq_a' => [
        [
          'Fileset3',
          '1.2.3.4',
          'COMMITTED',
          'Description of a different file'
        ]
      ],
      'same' => [
        {
          'same' => [
            {
              'same' => '1.0.2.3',
              'type' => ''
            },
            {
              'same' => 'COMMITTED',
              'type' => ''
            },
            {
              'same' => 'Description of file',
              'type' => ''
            },
            {
              'same' => 'Fileset1',
              'type' => ''
            }
          ],
          'type' => 'ARRAY'
        }
      ],
      'type' => 'ARRAY'
    };
    

    【讨论】:

    • 这看起来肯定会减少我试图避免的那些步骤。由此,我将确定每个唯一条目来自哪个库,并将它们列在正确的组中。万分感谢!我正在学习使用 perl,总有一种更简单的方法......
    猜你喜欢
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2013-05-19
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多