Регекспы в Perl @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 16 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
ptitov
новый человек
0
Сообщения: 175
Зарегистрирован: 22.07.02
Откуда: Москва
Заголовок сообщения: Регекспы в Perl
Сообщение Добавлено: 12 Март 2003, 11:46:38 
Нужно сделать замену вида
Код:
$str =~ s/([somechars]+)/$template/;

причём $template может содержать $1. Как заставить Perl обработать содержимое $template как код?

_________________
Иногда хостер
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 12 Март 2003, 11:49:53 
попробуй так!?
Код:
$str =~ s/([somechars]+)/$template/e;

_________________
:: metal kick ass ::
ptitov
новый человек
0
Сообщения: 175
Зарегистрирован: 22.07.02
Откуда: Москва
Сообщение Добавлено: 12 Март 2003, 13:02:26 
Попробовал, не получилось. А что делает "e"?
В документации (http://www.perldoc.com/perl5.8.0/pod/perlre.html) ничего подобного нету.

Update Стормозил. Уже понял. Но вопрос остаётся.

_________________
Иногда хостер


Последний раз редактировалось ptitov 12 Март 2003, 13:12:15, всего редактировалось 1 раз.
ptitov
новый человек
0
Сообщения: 175
Зарегистрирован: 22.07.02
Откуда: Москва
Сообщение Добавлено: 12 Март 2003, 13:09:12 
Мне, собственно говоря, надо даже немного иначе
Код:
$str =~ s/$from/$to/;

$from - регексп.

_________________
Иногда хостер
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 12 Март 2003, 13:19:01 
/e - правая часть s/// представляет собой исполняемый код

пример, проверено
Код:
$text='hello deforum';
$to='MPAK';
$text=~s/defor/$to/e;
print $text;

_________________
:: metal kick ass ::
ptitov
новый человек
0
Сообщения: 175
Зарегистрирован: 22.07.02
Откуда: Москва
Сообщение Добавлено: 12 Март 2003, 13:31:11 
Это в простейшем случае он работает...
А вот так - уже перестает.
Код:
$text='hello deforum';
$to='$1 MPAK';
$text=~s/de(for)/$to/e;
print $text;

_________________
Иногда хостер
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 12 Март 2003, 13:35:53 
а почему нельзя так?
Код:
$text='hello deforum';
$to="MPAK";
$text=~s/de(for)/$1.' '.$to/e;
print $text;

_________________
:: metal kick ass ::
ptitov
новый человек
0
Сообщения: 175
Зарегистрирован: 22.07.02
Откуда: Москва
Сообщение Добавлено: 12 Март 2003, 13:39:22 
Потому, что $1 содержится в переменной. Это принципиально.

_________________
Иногда хостер
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 12 Март 2003, 13:45:42 
ну тогда, лучше читать про обратные ссылки http://cs.mipt.ru/docs/comp/rus/program … r6/6_1.htm

_________________
:: metal kick ass ::
ptitov
новый человек
0
Сообщения: 175
Зарегистрирован: 22.07.02
Откуда: Москва
Сообщение Добавлено: 12 Март 2003, 16:03:10 
Прочёл. И что дальше?

_________________
Иногда хостер
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 12 Март 2003, 17:26:49 
скажи подробнее о проблеме? может можно и по другому ее решить?

_________________
:: metal kick ass ::
ptitov
новый человек
0
Сообщения: 175
Зарегистрирован: 22.07.02
Откуда: Москва
Сообщение Добавлено: 12 Март 2003, 17:35:46 
Есть регекспы в массиве (берутся из файла, их задание в коде недопустимо по некоторым соображениям), надо их все применить к заданной строке.

_________________
Иногда хостер
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 12 Март 2003, 17:38:20 
исходник в студию :)

_________________
:: metal kick ass ::
ptitov
новый человек
0
Сообщения: 175
Зарегистрирован: 22.07.02
Откуда: Москва
Сообщение Добавлено: 12 Март 2003, 17:45:55 
Код:
sub freetypo {
   my $rep = @_[0];
   my $exprs, $preexprs, $exprsn, $preexprsn, $i;

   # Load tables
   open(TABLE,$freetypo_path.'/exprs.txt') or die "freetypo: can't open $freetypo_path/exprs.txt: $!\n";
   while(<TABLE>){
      chomp;
      if($_ && $_ !~ /^#/){
         $exprsn++;
         ($exprs[$exprsn][0], $exprs[$exprsn][1]) = split(/\t/);
      }
   }
   close(TABLE);
   open(TABLE,$freetypo_path.'/preexprs.txt') or die "freetypo: can't open $freetypo_path/preexprs.txt: $!\n";
   while(<TABLE>){
      chomp;
      if($_ && $_ !~ /^#/){
         $preexprsn++;
         ($preexprs[$preexprsn][0], $preexprs[$preexprsn][1]) = split(/\t/);
      }
   }
   close(TABLE);

   # Apply preexprs
   for($i=1;$i<=$preexprsn;$i++){
      $rep =~ s/$preexprs[$i][0]/$preexprs[$i][1]/gse;
   }
   for($i=1;$i<=$exprsn;$i++){
      $rep =~ s/$exprs[$i][0]/$exprs[$i][1]/gs;
   }

   return $rep;
}

_________________
Иногда хостер
vexoid
новый человек
0
Сообщения: 295
Зарегистрирован: 15.12.02
Откуда: msk
Сообщение Добавлено: 12 Март 2003, 21:32:26 
всего один вопрос - запамятовал... можно ли получить массив(например в @a) с перечнем всех $1...$n ?
если да... то почему бы не сделать так...
$text =~ s/$from/&to(@a,$tostr)/e
дальше в to получаем значения, находим в $tostr все $n точнее нам надо получить n идём к $a[n] берём значение оттуда далее return $tostr с соответственным replace'ом $n на $a[n]

PS: на пхп знаю как реализовать - там в массив можно всё затолкать...

_________________
lost world... lost life... lost tomorrow... only night
MpaK999 Муж.
участник
1
Сообщения: 1716
Зарегистрирован: 14.11.02
Откуда: Ufa/Russia
Сообщение Добавлено: 13 Март 2003, 11:54:58 
циклом можно все затолкать

_________________
:: metal kick ass ::
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 16 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100