2010-08-27 50 views
8

我有兩個文本文件需要具有相同的值。在Perl如何在Perl中區分兩個文件?

open (ONE, "<A.txt"); 
open (TWO, "<B.txt"); 

$ diff A.txt B.txt 
4a5 
> I have this extra line. 
$ 

打開文件,我該怎麼辦這樣的差異在Perl中? Perl有內置的差異,還是我需要使用unix diff實用程序?我不想爲此實現我自己的差異算法。

我確實需要關於我的文件不同的信息,但我不需要使用unix diff實用程序。那只是一個例子。

+2

您確實需要「差異」輸出還是隻是一個文件是否相同的信號?如果你想要做的是確定這兩個文件是否一行一行地具有相同的內容,那麼在Perl中逐行讀取它們並比較這些行很容易,並且如果一對行不行則退出, t匹配。 – 2010-08-27 07:24:39

+0

@Ira Baxter:我只需要知道文件是否相同。 'diff'只是一個例子。 – Lazer 2010-08-27 08:11:00

+0

我很困惑:您對布萊恩福伊的評論似乎與您的其他評論相沖突。要重複Ira Baxter的問題,你是否需要知道**這些文件是否有差異**,或者你需要**它們有何不同**的細節。 – FMc 2010-08-27 10:42:48

回答

5

如果我只需要知道它們是相同的(即不知道它們有什麼不同),我只需使用Digest::MD5來查看它們是否提供了相同的摘要。兩個不同文件可能具有相同的MD5摘要的可能性很小,因此您甚至可以嘗試Digest::SHA1

如果你想知道哪些線路不同,那麼你可以使用Algorithm::Diff,或許可以結合Tie::File。但是,如果您的目標平臺上沒有diff工具,則還會附帶diff程序,該程序隨附Algorithm::Diff。儘管你可以摒棄這一點,但你可能只想將它做的事情複製到一個子程序中。 Text :: Diff構建於Algorithm::Diff之上,因此它可能已經想要你了。

+0

我需要知道哪些所有行比較。 – Lazer 2010-08-27 08:29:48

+0

那麼,你應該說。在你對艾拉的評論中,你以其他方式說。 – 2010-08-28 21:55:17

+0

如果您讀取兩個文件並比較每個字節,則碰撞概率爲零。散列對於某些事情非常有用,例如通過網絡比較文件(不發送整個文件)或比較數千個文件。爲了比較位於同一臺機器上的兩個文件(在同一時間點),散列的優點是什麼? – bk1e 2010-09-25 18:01:34

1

不,Perl沒有內置的「diff」工具。要麼使用外部模塊,要麼使用Perl的數據結構(哈希,數組等),或者爲這兩個文件創建文件句柄,並使用文件句柄(while循環)迭代文件,逐行比較它們。此方法假定您的文件已排序。另一個不太好的方法是從Perl中調用「diff」,但我建議不要這樣做。最後,如果Perl不是必須的,只需使用Unix diff實用程序(編寫一個shell腳本)。

相關問題