Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Показать разницу между 2 строками


Автор: Suppir 22.4.2011, 17:23
Есть две строки:

О тарифе на услуги по передаче электрической энергии по сетям ОАО "Лесопромышленная холдинговая компания "Коношалес"
О тарифе на услугу по передаче электрической энергии по сети ОАО "Лесопромышленная холдинговая компания "Коношалес"


Необходимо визуально показать разницу между двумя строками. Как-нибудь так:

О тарифе на услуги по передаче электрической энергии по сетям ОАО "Лесопромышленная холдинговая компания "Коношалес"
О тарифе на услуг<у> по передаче электрической энергии по сет<и> ОАО "Лесопромышленная холдинговая компания "Коношалес"


Уже голову сломал, не знаю как это сделать  smile 

Автор: alezzz 22.4.2011, 17:51
Algorithm::Diff не подойдет?

Автор: KSURi 22.4.2011, 18:43
diff работает построчно. Смотрите на программу wdiff и алгоритм, который в ней реализован.

Автор: arto 22.4.2011, 20:45
split "\\s+"
или
split ""

Автор: DurRandir 22.4.2011, 22:47
String::Diff ?

Автор: mishnik 1.5.2011, 20:52
Suppir, 
я бы разбил на массив по слову в массиве и, если слово не совпадает, то
обрамлять <услугу>
слова пока научитесь сравнивать, а там и до букв дойдет;))

Автор: SkoobyDoo 1.5.2011, 23:27
Suppir, мне кажется то, что предложил DurRandir, как раз ваш случай
Код

#!/usr/bin/env perl

use strict;
use warnings;
use String::Diff;
use utf8;
use open qw(:std :utf8);

my $str1 = 'О тарифе на услуги по передаче электрической энергии по сетям ОАО "Лесопромышленная холдинговая компания "Коношалес"';
my $str2 = 'О тарифе на услугу по передаче электрической энергии по сети ОАО "Лесопромышленная холдинговая компания "Коношалес"';

my @strs = String::Diff::diff(
  $str2, $str1,
  remove_open  => '<',
  remove_close => '>'
);

print $strs[0], "\n";
$strs[1] =~ s/\{|\}//g;
print $strs[1], "\n";

на выходе
Код

О тарифе на услуг<у> по передаче электрической энергии по сет<и> ОАО "Лесопромышленная холдинговая компания "Коношалес"
О тарифе на услуги по передаче электрической энергии по сетям ОАО "Лесопромышленная холдинговая компания "Коношалес"

Автор: Suppir 2.5.2011, 12:21
SkoobyDoo, спасибо. А можно ли сделать то же самое, но с помощью Algorithm:diff ?
Просто string:diff нет в стандартном ActivePerl.

Автор: mishnik 2.5.2011, 12:30
Suppir, 
в strawberry есть, Larry Wall именно им рекомендует пользоваться,
activeperl - все-таки плох

Автор: Suppir 2.5.2011, 12:35
mishnik, дело в том, что мне нужно будет распространить скрипт по клиентам. У них стоят Perl 5.8, 5.10 и выше, в основном ActiveState (я раньше рекомендовал им). Устанавливать модули 95% пользователей не умеет (особенно, если требуется компилятор). Поэтому все скрипты пишу таким образом, чтобы хватило стандартного ActivePerl...

Добавлено @ 12:37
Strawberry я пробовал, когда он только появился. Оказалось, что поиск-замена с регулярными выражениями работает в нем на 30 - 50% медленней, чем в ActivePerl. Возможно, сейчас ситуация и исправилась, кто знает.

p.s. если ставить Strawberry, то какой лучше: тот что на оф. сайте или тот что с Padre?


Автор: shamber 2.5.2011, 13:00
Suppir, а написать простенький скрипт для установки модуля с cpan, или локального зеркала если инета нет?

Автор: Suppir 2.5.2011, 13:18
shamber, никогда не пробовал  smile 

Автор: mishnik 2.5.2011, 13:36
Suppir, 
я бы ставил c http://padre-perl-ide.googlecode.com/files/strawberry-plus-padre-0.63.msi
и далее с обязательным запуском строки 

Код

c:\strawberry\perl\bin\perl.exe -MCPAN -e "CPAN->upgrade('/^Padre/')"

и далее ставим любой модуль
Код

C:\strawberry\perl\bin>c:\strawberry\perl\bin\perl.exe -MCPAN -e "CPAN->install('String::Diff')"

Автор: shamber 2.5.2011, 13:44
mishnik, зачем ему падре на клиентах?

Автор: Suppir 2.5.2011, 14:21
Кстати, насколько я понял, этот padre также основан на Scintilla, как и SciTE.

Автор: SkoobyDoo 2.5.2011, 17:43
Цитата(Suppir @ 2.5.2011,  17:21)
Кстати, насколько я понял, этот padre также основан на Scintilla, как и SciTE.

Padre написан на perl + wxWidgets.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)