Как я могу различить два файла в Perl? - PullRequest
9 голосов
/ 27 августа 2010

У меня есть два текстовых файла, которые должны иметь одинаковые значения.

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

Открытие файлов в Perl

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

Как я могу сделать такой diff из Perl? Есть ли в Perl встроенный diff или мне нужно использовать утилиту unix diff? Я не хочу реализовывать свой собственный алгоритм сравнения для этого.

Мне нужна информация о том, где мои файлы отличаются, но мне не обязательно обязательно использовать утилиту unix diff Это был просто пример.

Ответы [ 3 ]

12 голосов
/ 27 августа 2010

Вы можете попробовать использовать Text :: Diff

В качестве альтернативы можно использовать утилиту UNIX.

5 голосов
/ 27 августа 2010

Если бы мне нужно было только знать, что они одинаковы (то есть не узнать, чем они отличаются), я бы просто использовал Digest :: MD5 , чтобы увидеть, подходят ли они к одному и тому же дайджесту.Существует невероятно малая вероятность того, что два разных файла могут иметь один и тот же дайджест MD5, поэтому вы можете даже попробовать Digest :: SHA1 .

Если вы хотите узнать, какие строки отличаются, тоВы можете использовать Algorithm :: Diff , возможно, в сочетании с Tie :: File .Однако есть также программа diff , которая поставляется с Algorithm :: Diff , если на целевой платформе нет инструмента diff.Хотя вы можете это сделать, вы можете просто скопировать то, что он делает, в подпрограмму.Text :: Diff построен поверх Algorithm :: Diff , поэтому он может уже хотеть, чтобы вы захотели.

2 голосов
/ 27 августа 2010

Нет, в Perl нет встроенной функции "diff". Либо вы используете внешний модуль, либо используете структуры данных Perl (хэши, массивы и т. Д.), Либо вы создаете файловые дескрипторы для обоих файлов, и итерируете файлы, используя файловый дескриптор (циклы while), сравнивая их построчно. Этот метод предполагает, что ваши файлы отсортированы. Другой не очень элегантный способ - вызывать diff из Perl, но я советую против этого.

Наконец, если Perl не обязателен, просто используйте утилиту Unix diff (напишите сценарий оболочки).

...