İle perl
:
if perl -0777 -e '$n = <>; $h = <>; exit(index($h,$n)<0)' needle.txt haystack.txt
then echo needle.txt is found in haystack.txt
fi
-0octal
Kayıt sınırlayıcıyı tanımlar. Bu sekizlik sayı 0377'den (maksimum bayt değeri) büyük olduğunda, bu sınırlayıcı olmadığı anlamına gelir, buna eşdeğerdir $/ = undef
. Bu durumda, <>
tek bir dosyanın tam içeriğini döndürür, bu slurp modudur .
Dosyaların içeriğini iki $h
ve $n
değişken olarak aldıktan sonra , index()
birinin diğerinde bulunup bulunmadığını belirlemek için kullanabiliriz .
Ancak bu, tüm dosyaların bellekte depolandığı anlamına gelir; bu, bu yöntemin çok büyük dosyalar için çalışmayacağı anlamına gelir.
Mmappable dosyaları için (genellikle normal dosyaları ve blok aygıtlar gibi en çok aranabilir dosyaları içerir), perl modülü mmap()
gibi dosyalar üzerinde çalışılarak çözülebilir Sys::Mmap
:
if
perl -MSys::Mmap -le '
open N, "<", $ARGV[0] || die "$ARGV[0]: $!";
open H, "<", $ARGV[1] || die "$ARGV[1]: $!";
mmap($n, 0, PROT_READ, MAP_SHARED, N);
mmap($h, 0, PROT_READ, MAP_SHARED, H);
exit (index($h, $n) < 0)' needle.txt haystack.txt
then
echo needle.txt is found in haystack.txt
fi