Написал скрипт по поиску дублирующих ссылок в двух htm файлах - берется ссылка из первого файла и ищется во втором эта найденная в первом.
Если не находится, то в результирующий файл записывается строка из первого файла из которой выделена искомая подстрока.
По задумке в выходном файле должны остаться только те строки из первого файла, которые содержат ссылки отсутствующие во втором файле.
На практике же результат получился частичный - да часть отсеивается, но есть повторяющиеся.
И я не могу понять почему это происходит. Я сравнивал эти оставшиеся строки с помощью текстового редактора (Far) - строки идентичны, а m// не находит их во втором файле.Вот мой скрипт:
my $NameFile = shift @ARGV;
open (FH, "<$NameFile") or die ("Cannot open file \"$NameFile\"");
my @array=<FH>;
close FH;$NameFile = shift @ARGV;
open (FH, "<$NameFile") or die ("Cannot open file \"$NameFile\"");
my @array2=<FH>;
close FH;open (OUT, ">Test.tmp") or die ("Cannot open file Test.tmp");
my ($m,$n,$f)=0;
my $p;
foreach my $r (@array) {
if($r=~/href="(.+?)"/)#ищем строку, содержащую ссылку
{
$m++;
$p=$1;
print "$p\n";
$f=0;
foreach (@array2)#ищем строку, содержащую ранее найденную ссылку
{
if(/$p/) {print "$_\n"; $f=1;}
}
if($f==0)#если нет дублирующих ссылок
{
print OUT $r;
$n++;
}
}
}close OUT;
print "\nВсего ссылок в первом файле = $m, из них отсутствующих во втором файле = $n";Подскажите, пожалуйста, что я не так сделал.
>[оверквотинг удален]
> {
> print OUT $r;
> $n++;
> }
> }
> }
> close OUT;
> print "\nВсего ссылок в первом файле = $m, из них отсутствующих во
> втором файле = $n";
> Подскажите, пожалуйста, что я не так сделал.покажите исходные файлы со строками и результат
>[оверквотинг удален]
>> print OUT $r;
>> $n++;
>> }
>> }
>> }
>> close OUT;
>> print "\nВсего ссылок в первом файле = $m, из них отсутствующих во
>> втором файле = $n";
>> Подскажите, пожалуйста, что я не так сделал.
> покажите исходные файлы со строками и результат<LI><A href="https://www.youtube.com/watch?v=2Rf01iJGS2g">TFT SPI 128*160</A>
<LI><A href="http://compcar.ru/forum/showthread.php?t=6064">Видеокарта для Arduino (arduinoVideioCard).</A>
<LI><A href="http://avr-start.ru/?p=3983">Управление симистором. Еще раз про таймеры. | AVR-START.RU</A>
<LI><A href="https://www.youtube.com/watch?v=12rcdJKSGFc">Как устроен Python? > Детальный разбор</A>Вот эти строки содержатся в обоих файлах - они идентичны и именно эти строки не обрабатываются моим скриптом, во всяком случае, так как мне нужно.
Я предполагаю, что это из-за содержимого самих строк, а конкретно в чем проблема не знаю.
>[оверквотинг удален]
> {
> print OUT $r;
> $n++;
> }
> }
> }
> close OUT;
> print "\nВсего ссылок в первом файле = $m, из них отсутствующих во
> втором файле = $n";
> Подскажите, пожалуйста, что я не так сделал.возможно это ссылки содержащие в себе вопросительный знак
>[оверквотинг удален]
>> print OUT $r;
>> $n++;
>> }
>> }
>> }
>> close OUT;
>> print "\nВсего ссылок в первом файле = $m, из них отсутствующих во
>> втором файле = $n";
>> Подскажите, пожалуйста, что я не так сделал.
> возможно это ссылки содержащие в себе вопросительный знакДа, в теле этих ссылок содержится вопросительный знак.
И как это обойти?
> if(/$p/)а перл нормально к таким подстановкам относится? В смысле спецсимволы дополнительно экранировать не надо?
и если про поиск, то почему не выбрать все ссылки из файлов сразу, а потом сравнивать два массива?
>> if(/$p/)
> а перл нормально к таким подстановкам относится? В смысле спецсимволы дополнительно экранировать
> не надо?Скорее всего в этом и проблема, но как эту ситуацию обработать я не знаю.
> и если про поиск, то почему не выбрать все ссылки из файлов
> сразу, а потом сравнивать два массива?Не вижу в этом смысла.
> но как эту ситуацию обработать я не знаю.наверно так
m/\Q$p/> Не вижу в этом смысла.
ну да, простое сравнение строк не идет ни в какой сравнение с интерполированным регекспом :)
особенно когда на самом деле там нет регекспа как такового, а производится поиск по строке
>> но как эту ситуацию обработать я не знаю.
> наверно так
>m/\Q$p/Сработало! Спасибо большое!