2010-08-27 21 views
8

Tengo dos archivos de texto que deben tener los mismos valores.¿Cómo puedo distinguir dos archivos en Perl?

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

Abrir archivos en Perl

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

¿Cómo puedo hacer un diff como desde dentro de Perl? ¿Perl tiene una diferencia incorporada o necesito usar la utilidad unix diff? No quiero implementar mi propio algoritmo de diferencias para esto.

Necesito la información sobre dónde difieren mis archivos, pero no necesito usar necesariamente la utilidad unix diff. Eso fue solo un ejemplo.

+2

¿Realmente necesita la salida "diff" o simplemente una señal de que los archivos son idénticos o no? Si todo lo que quiere hacer es determinar si los dos archivos tienen el mismo contenido línea por línea, es bastante fácil leerlos línea por línea en Perl y comparar las líneas, y salir con una queja si un par de líneas no lo hacen t partido. –

+0

@Ira Baxter: Solo necesito descubrir que los archivos son idénticos o no. 'diff' fue solo un ejemplo. – Lazer

+0

Estoy confundido: su comentario sobre Brian Foy parece entrar en conflicto con sus otros comentarios. Para repetir la pregunta de Ira Baxter, ¿simplemente necesita saber ** si los archivos difieren **, o necesita detalles sobre ** cómo difieren **? – FMc

Respuesta

12

Usted podría tratar de usar Text::Diff

Por otra parte, la utilidad de UNIX podría ser una opción.

5

Si solo tuviera que saber que eran iguales (es decir, no descubro cómo son diferentes), solo usaría Digest::MD5 para ver si presentan el mismo resumen. Hay una posibilidad mínimamente pequeña de que dos archivos diferentes puedan tener el mismo resumen MD5, por lo que incluso puedes probar Digest::SHA1.

Si quiere saber qué líneas son diferentes, entonces puede usar Algorithm::Diff, quizás junto con Tie::File. Sin embargo, también existe un programa diff que viene con Algorithm::Diff si no tiene una herramienta diff en su plataforma de destino. Aunque puede pagarlo, es posible que desee copiar lo que hace en una subrutina. Text :: Diff está construido en la parte superior de Algorithm::Diff, por lo que es posible que ya desee lo que desee.

+0

Necesito saber que todas las líneas 'dif'. – Lazer

+0

Bueno, entonces deberías decir eso. En tu comentario a Ira, dijiste lo contrario. –

+0

No hay posibilidad de una colisión si lee ambos archivos y compara cada byte.La función hash es ideal para algunas cosas, como comparar archivos en la red (sin enviar todo el archivo) o comparar miles de archivos entre sí. Para comparar dos archivos que se encuentran en la misma máquina (en el mismo momento), ¿cuál es la ventaja del hash? – bk1e

1

No, Perl no tiene una función "diff" incorporada. O bien utiliza un módulo externo, o usa las estructuras de datos de Perl (hashes, arrays, etc.) o crea manejadores de archivo para ambos archivos, e itera los archivos usando el manejador de archivos (while loops), comparándolos línea por línea. Este método supone que tus archivos están ordenados. Otra forma no tan elegante es llamar "diff" de Perl, pero desaconsejo eso.

Por último, si Perl no es obligatorio, simplemente use la utilidad Unix diff (escriba un script de shell).

Cuestiones relacionadas