2010-07-14 50 views
2

例如:如何比較Perl中2個文件中的數據?

文件1:

Apple 
Orange 
grapes 

文件2:

Orange 
grapes 
Apple 

我想檢查兩個文件是否有不同順序相同的數據。

如何做到這一點,而無需使用任何外部模塊?

+0

你可以執行'diff'這樣的命令行工具嗎? – 2010-07-14 10:49:44

+1

爲什麼「不使用任何外部模塊」? – 2010-07-14 11:04:58

+0

['File :: Compare'](http://perldoc.perl.org/File/Compare.html)是核心並解決了部分問題。 – daxim 2010-07-14 12:17:30

回答

4
use strict; 
use warnings; 

# $d{LINE} = TALLY 
my ($n, %d) = (1); 
while (<>){ 
    $d{$_} += $n; 
    $n *= -1 if eof; 
} 

# Now get whatever kind of lines you are interested in. 
my @same_in_both_files = grep { $d{$_} == 0 } keys %d; 
my @surplus_in_file1 = grep { $d{$_} > 0 } keys %d; 
my @surplus_in_file2 = grep { $d{$_} < 0 } keys %d; 

# Or just get a true-false verdict. 
my $files_differ = 1 if grep $_, values %d; 
+0

一些更可讀的Perl我見過一段時間... – 2010-07-14 13:11:42

3

如果您想使用perl來查找兩個文件之間的差異,您可以嘗試使用Text::Diff CPAN模塊。

+1

我不能使用該主機上的任何extenal模塊! – Tree 2010-07-14 10:41:58

+5

是的,你可以。該模塊是純粹的Perl,所以如果你可以在主機上保存一個文件,那麼你可以使用它。至少你可以在你編碼生命的地方創建一個Text dir,在那裏保存http://cpansearch.perl.org/src/ADAMK/Text-Diff-1.37/lib/Text/Diff.pm,然後創建一個Diff dir在那裏,保存該目錄中的http://cpansearch.perl.org/src/ADAMK/Text-Diff-1.37/lib/Text/Diff/Table.pm,鏡像http://中找到的lib目錄的內容cpansearch.perl.org/src/ADAMK/Text-Diff-1.37/我不是說這是要使用的模塊,只是最有可能使用模塊,至少是純Perl模塊 – mirod 2010-07-14 10:53:36

+0

優秀 - 它非常棒有用.... – Tree 2010-07-14 14:16:29

3

手動操作是一個簡單的練習。將第一個文件讀入一行/ linenumber的散列表,然後從該表中刪除第二個文件。如果存在一個使用者的話,把它放到第二個表中。表中的任何內容都表示不匹配的內容,並且表中包含不同行的行號。

4

這是一個簡單的事情,即將兩個文件的每一行讀入一個散列,然後比較兩個散列的內容。基本上這是一個初學者的編程練習。

+0

我已根據您的意見解決問題 – Tree 2010-07-14 11:34:10

2

這裏有一個簡單的方法做你想做的事,perl的:

在pfile1:

Apple 
Orange 
grapes 

在pfile2:

Orange 
grapes 
Apple 

perl腳本:

#!/usr/bin/env perl 

open (FILE1, "pfile1") || die ("Can't open file pfile1 for reading"); 
open (FILE2, "pfile2") || die ("Can't open file pfile2 for reading"); 

my @file1 = <FILE1>; 
my @file2 = <FILE2>; 

@sorted_file1 = sort @file1; 
@sorted_file2 = sort @file2; 

die("Your Files are different\n") 
    unless ($#sorted_file1 == $#sorted_file2); 

for my $item (0 .. $#sorted_file1) { 
    if ($sorted_file1[$item] ne $sorted_file2[$item]) { 
    die("Your Files are different\n"); 
    } 
} 
print "Your Files are the same\n"; 

這是通過閱讀文件行放入數組中,然後對數組進行排序。它檢查兩個數組的長度是否相同,如果兩個數組之間的相應索引值不同,則會提前退出。

然後您將收到一條消息,指出這些文件是相同的或不相同的。