|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Artem Chuprina 2:5020/400 16 Jul 2002 15:52:05 To : "Dmitry Koteroff" Subject : Re: Регексп - замена по хешу. -------------------------------------------------------------------------------- Здравствуй, Dmitry Koteroff. DK> Здравствуйте, Roman. DK> 15 июля 2002 года, понедельник, 11:01. Вы написали: DK> > Есть хеш с парами "что менять"=>"на что менять". DK> > Hапример, аббревиатуры заменять на код их расшифровки или ключевые DK> > слова на ссылки на них. Менять надо всюду, кроме внутренностей ссылок и DK> > тэгов. DK> Это довольно стандартная задача, в общем случае (для тысяч регулярных DK> выражений) решается при помощи создания замыканий (предварительной DK> компиляции кода): DK> %regexps = ( DK> qr/тра/is => "ТрА", DK> qr/ля/is => "лЯ", DK> ); DK> # сначала компилируем несколько функций - по одной DK> # для каждого выражения. DK> my @func=(); DK> while(my ($re,$to)=each(%regexps)) { DK> push @func, sub { s/$re/$to/sg }; DK> } А ты пробовал? А то тут ругается "Modification of a read-only value attempted" DK> # затем читаем строки по одной и заменяем. DK> while(<>) { DK> # проходим по всем выражениям и заменяем их в $_ DK> foreach my $f (@func) { &$f() } DK> print $_; DK> } Логичнее будет скомпилировать в одну функцию. А то накладные расходы на вызов рискуют подавить преимущества от прекомпиляции. -- Artem Chuprina Communiware.net RFC2822: <ran@ran.pp.ru>, FIDO: 2:5020/358.49, ICQ: 13038757 --- ifmail v.2.15dev5 * Origin: Leninsky 45 home network (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/1445454a9fa78.html, оценка из 5, голосов 10
|