2013-01-09 96 views
3

我编写了一个perl脚本来审计一个库,并将已安装软件的列表与另一台机器的列表进行比较,以确保它们工作的是相同的东西。我已经采集了原始数据并将其放入了两个尺寸为Nx4的二维数组,其中N是软件标题的数量。例如:Perl二维数组比较问题

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

我现在需要比较两个列表找到的差异,他们是否会丢失水平的差异文件。目前还不是Perl专业版,我可以想象做到这一点的唯一方法是将第一个数组的每个元素与另一个数组的每个元素进行比较,以首先查找具有不同级别的匹配文件集或完全不匹配的文件集。我将不得不与其他清单重复这个过程,以确保我找到了所有可能的差异。显然,在这个过程中,我正在考虑大于n^2的效率。我想知道是否有某种应用程序grep可以使用或类似的东西来避免这种情况,当比较超过20,000条目的库时。

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

在此先感谢您的帮助!

回答

3

输出是有点笨拙,但我喜欢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' 
}; 
+0

这肯定看起来像它会削减掉那些我试图避免的步骤。从这里我将确定每个唯一条目来自哪个库,并将它们列在适当的组中。万分感谢!我正在用Perl学习,总有一种更简单的方法... – nashter