如何在Perl中比较两个文件的差异?

8
我有两个文本文件,需要拥有相同的值。
$ diff A.txt B.txt
4a5
> I have this extra line.
$

Perl中打开文件

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

我该如何在Perl中进行这样的差异比较?Perl有内置的差异比较功能吗?还是我需要使用Unix的diff实用程序?我不想为此编写自己的差异算法。
我确实需要知道我的文件在哪里有所不同,但我不一定需要使用Unix的diff实用程序。那只是一个例子。

2
你实际上需要“diff”输出还是只需要一个信号来表明文件是否相同?如果你只想确定两个文件的内容逐行是否相同,那么在Perl中逐行读取它们并比较这些行非常容易,如果一对行不匹配,则退出并发出警告。 - Ira Baxter
@Ira Baxter:我只需要找出这些文件是否相同。diff只是一个例子。 - Lazer
我很困惑:你对brian d foy的评论似乎与你的其他评论相矛盾。为了重复Ira Baxter的问题,你是否只需要知道文件是否不同,还是需要关于它们如何不同的详细信息。 - FMc
4
如何使用Perl判断两个文件的内容是否相同? - Zaid
@FM:我需要知道它们的区别,但我不一定需要使用diff工具,这就是我的意思。 - Lazer
@Lazer:如果您只想计算行数,那么简单的读取-比较循环也可以回答这个问题。 - Ira Baxter
4个回答

12
你可以尝试使用Text::Diff
或者,UNIX实用程序也是一种选择。

5
如果我只需要知道它们是否相同(即不需要发现它们的区别),我会使用Digest::MD5来查看它们是否生成相同的摘要。两个不同的文件具有相同的MD5摘要的可能性非常小,因此您甚至可以尝试Digest::SHA1
如果您想找出哪些行不同,那么您可以使用Algorithm::Diff,可能还要结合Tie::File。但是,如果您在目标平台上没有diff工具,则也可以使用附带Algorithm::Diffdiff程序。虽然您可以通过shell调用它,但您可能只想将其复制到子例程中。Text::Diff是建立在Algorithm::Diff之上的,因此它可能已经实现了您想要的功能。

我需要知道哪些行被 diff 了。 - Lazer
那么,你应该这样说。在你对艾拉的评论中,你说得不一样。 - brian d foy
如果您读取两个文件并比较每个字节,则不会发生冲突的可能性为零。哈希在某些方面非常有用,例如在网络上比较文件(而无需发送整个文件)或将数千个文件相互比较。对于位于同一台机器上(在同一时间点)的两个文件进行比较,哈希的优势是什么? - bk1e
嗯,你可能会节省很多时间。假设你有1000个文件。那是很多需要检查的两个文件组合。更不用说这些文件可能很大。你可以为每个文件只生成一次哈希值,然后进行简单的比较。 - brian d foy
散列解决方案显然更好,如果您想多次比较每个文件。然而,对于单个比较,始终会给出最坏情况的性能场景,需要扫描两个文件的所有内容。 - Nate C-K

2
不,Perl没有内置的"diff"功能。您可以使用外部模块,或使用Perl的数据结构(哈希、数组等),或为两个文件创建文件句柄,并使用文件句柄迭代文件(while循环),逐行比较它们。这种方法假设您的文件已排序。另一种不那么优雅的方法是从Perl调用"diff",但我建议不要这样做。
最后,如果Perl不是必须的,只需使用Unix的diff实用程序(编写一个shell脚本)。

0
你可以使用核心模块 File::Compare
use File::Compare;
if (compare("file1","file2") == 0) {
    print "They're equal\n";
}

文档在这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接