|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Sergey V. Leschenko 2:5020/400 26 Jul 2002 18:39:02 To : Andrey Titov Subject : Re: А как сделать чтобы тек ст в [ ] не заменялся? -------------------------------------------------------------------------------- Andrey Titov wrote: AT>> $body =~ s/^([^\[]*?)рубль/$1доллар/g; AT>> $body =~ s/(\][^\[]*?)рубль([^\[]*?\[)/$1доллар$2/g; AT>> $body =~ s/рубль([^\]]*?)$/доллар$1/g; AT>> AT> Спасибо, попробую, но конечно хотелось бы найти более элегантное решение AT> проблемы. данная задача разделяется на 3: - заменить все то, что перед первой открывающей скобкой - заменить все то, что вне скобок, но между блоков [ ... ] - заменить все то, что находится после последней закрывающей скобки в perl нет выражения 'не заменять', есть 'заменить найденное', а как собрать эти 3 выражения в одно я не знаю (да и так нормально) AT>Это нужно для скрипта преобразующего транслит в кириллицу. Каждая AT> латинская буква и комбинация из нескольких букв преобразуется в AT> соответствующую русскую букву. Заключённое в скобках переводиться не будет. AT> Может сразу вырезать, заключённое в скобках, остальное перевести, а AT> содержимое скобок потом вернуть обратно на свои места. Или перекодировать AT> перед переводом содержимое скобок в что-нибудь, потом перевести, а потом AT> перекодировать назад. а не проще ли будет перебирать посимвольно? или даже так: while( length($body) > 0 ) { if($body =~s/^(\w)// ) { $newbody .= convert($1); } elsif($body =~ s/^(\s+)// ) { $newbody .= $1; } elsif($body =~ s/^(\[[^]]*\])// ) { $newbody .= $1; } } -- Best regards, sm@adamant.net Sergey smash@astral.ntu-kpi.kiev.ua --- ifmail v.2.15dev5 * Origin: Adamant ISP news server (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор Архивное /ru.perl/1341191130eae.html, оценка из 5, голосов 10
|