2013-01-09 124 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