2010-08-27 12 views
8

Aynı değerlere sahip olması gereken iki metin dosyam var. Perl'de iki dosyayı nasıl değiştirebilirim?

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

Perl

yılında

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

dosyaları açma nasıl Perl içinden böyle bir diff yapabilirim? Perl'de dahili bir fark var mı yoksa unix diff yardımcı programını mı kullanmalıyım? Bunun için kendi algoritmamı uygulamak istemiyorum.

Dosyalarımın nerede farklı olduğuna dair bilgiye ihtiyacım var, ancak unix diff yardımcı programını kullanmam gerekiyor. Bu sadece bir örnekti.

+2

Aslında "diff" çıkışına mı ihtiyacınız var, yoksa sadece dosyalar aynı mı, yoksa bir işaret mi? Tek yapmanız gereken, iki dosyanın aynı içerik satırına sahip olup olmadığını belirlemekse, bunları Perl satırında satır satır okumak ve satırları karşılaştırmak oldukça kolaydır ve eğer bir çift satır yoksa bir şikayetle çıkın. t eşleşme. –

+0

@Ira Baxter: Sadece dosyaların aynı olup olmadığını bulmam gerek. 'diff' sadece bir örnekti. – Lazer

+0

Kafam karıştı: Brian d foy hakkındaki yorumunuz diğer yorumlarınızla çelişiyor. Ira Baxter'in sorusunu tekrarlamak için, ** dosyaların farklı olup olmadığını ** bilmeniz mi, yoksa ** nasıl farklılık gösterdiğine dair detaylara mı ihtiyacınız var **. – FMc

cevap

12

Sen Text::Diff

Alternatif UNIX yarar bir seçenek olabilir kullanarak deneyebilirsiniz.

5

Sadece aynı olduklarını (yani farklı olduklarını keşfetmediklerini) bilmeme izin verdiysem, aynı özetle ortaya çıkıp çıkmadıklarını görmek için Digest::MD5 kullanıyorum. İki farklı dosyanın aynı MD5 özetini kullanabileceği küçük bir şans var, yani Digest::SHA1'u bile deneyebilirsiniz.

Hangi satırların farklı olduğunu öğrenmek isterseniz, Algorithm::Diff, belki de Tie::File ile birlikte kullanabilirsiniz. Ancak, hedef platformunuzda bir fark aracınız yoksa, Algorithm::Diff ile birlikte gelen farkl programı da vardır. Bunu yapabilmenize rağmen, bir altprograma ne yaptığını kopyalamak isteyebilirsiniz. Metin :: Diff Algorithm::Diff üstünde yerleşik, bu yüzden zaten istediğinizi isteyebilirsiniz.

+0

Tüm hatların farklı olduğunu bilmek istiyorum. – Lazer

+0

Peki, o zaman söylemelisin. Irak’a yaptığınız yorumda, aksi söyledik. –

+0

İki dosyayı da okursanız ve her bir byte karşılaştırırsanız, bir çarpışma olasılığı sıfırdır.Hashing, ağ üzerinden dosyaları (tüm dosyayı göndermeden) karşılaştırmak veya binlerce dosyayı birbiriyle karşılaştırmak gibi bazı şeyler için mükemmeldir. Aynı makinede bulunan iki dosyayı karşılaştırmak için (aynı zamanda), karma yemin avantajı nedir? – bk1e

1

Hayır, Perl'in yerleşik "diff" özelliği yoktur. Ya harici bir modül kullanıyorsunuz ya da Perl'in veri yapılarını (karma, diziler vb.) Kullanıyorsunuz ya da her iki dosya için de dosya grupları oluşturuyorsunuz ve dosyaları dosya satırını kullanarak (döngüler sırasında) satır satırlarını karşılaştırarak yinelediniz. Bu yöntem dosyalarınızın sıralandığını varsayar. Başka bir şık olmayan yol Perl'den "diff" demektir, fakat buna karşı tavsiyede bulunurum.

Son olarak, Perl zorunlu değilse, Unix diff yardımcı programını kullanın (kabuk komut dosyası yazın).

İlgili konular