Модераторы: ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Рег. выраж. Оператор подстановки, Проблема с операндом замена 
:(
    Опции темы
tolkien
Дата 5.5.2008, 05:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: нет
Всего: 4



Доброе утро! Возникла проблема с подстановкой. Операнд замены интерпретируется только один раз. 

Листинг 1
Код

my $m1 = '(\d+) (\d+),(\d+)'; 
my $m2 = '$1$2.$3'; 

my $s = '15 148,02';

$s =~ s/$m1/$m2/;

Получаю вместо 15148.02       $1$2.$3

Пока нашел только такое решение. 

Листинг 2
Код

my $m1 = '(\d+) (\d+),(\d+)'; 
$m2 = '$1.$2.".".$3';

my $s = '15 148,02';

$s =~ s/$m1/$m2/ee;


Можно как нибудь явно указывать что необходима еще дополнительная интерпретация? И решить данную задачу без внесении изменений в шаблон $m2 Листинг1?

P.S решение такого вида $s =~ s/$m1/$1$2.$3/ не подходит т.к шаблоны загружаются из внешнего файла.




PM MAIL   Вверх
FooBar
Дата 5.5.2008, 06:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 25.2.2008

Репутация: нет
Всего: 3



модификатор g?
хотя похоже вы не об этом..

Это сообщение отредактировал(а) FooBar - 5.5.2008, 06:46
PM MAIL   Вверх
amg
Дата 5.5.2008, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: нет
Всего: 50



Цитата(tolkien @  5.5.2008,  05:16 Найти цитируемый пост)
... решить данную задачу без внесении изменений в шаблон $m2 Листинг1?
Код
$s =~ s/$m1/qq("$m2")/ee;


PM MAIL   Вверх
sir_nuf_nuf
Дата 5.5.2008, 07:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 1
Всего: 31



можно.
Для того что бы ссылаться на строки, захваченые в () ВНУТРИ регулярного выражения нужно использовать не $1 $2 а \1 \2

пример
Код

$a = "abc123def";
$a =~ s/(\d)(\d)(\d)/\3\2\1/;
print $a;



результат
Код

abc321def




в вашем случае:
Код

$s =~ s/(\d+) (\d+),(\d+)/\1\2.\3/;



--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
amg
Дата 5.5.2008, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: нет
Всего: 50



Цитата(sir_nuf_nuf @  5.5.2008,  07:57 Найти цитируемый пост)
Для того что бы ссылаться на строки, захваченые в () ВНУТРИ регулярного выражения нужно использовать не $1 $2 а \1 \2
sir_nuf_nuf, если иметь в виду поисковую часть оператора s///, то Вы совершенно правы. А в заменяющей части этого оператора (а также вне регулярного выражения) использовать нотацию \1 \2 нет смысла. Оно там лишь для совместимости с sed и пр. С use warnings перл даже поругается в том смысле, что $1 лучше, чем \1. К тому же, замена $1 на \1, насколько я понимаю, никак не решает проблему, поставленную топикстартером. Кроме того, такая замена противоречит условию задачи (не трогать $m2).

Это сообщение отредактировал(а) amg - 5.5.2008, 08:42
PM MAIL   Вверх
tolkien
Дата 5.5.2008, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: нет
Всего: 4



FooBar
Точно модификатор /g здесь не в теме

sir_nuf_nuf
Замена $1 на \1 не решает проблему. Ничего не меняется. 

amg
Спасибо работает.
PM MAIL   Вверх
amg
Дата 5.5.2008, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: нет
Всего: 50



Цитата(tolkien @  5.5.2008,  05:16 Найти цитируемый пост)
Можно как нибудь явно указывать что необходима еще дополнительная интерпретация?
tolkien, не уверен, но мне кажется, что интерполяция /eeнеобходима и достаточна. 

Другой вопрос - автоматическое определение вида заменяющей части. Например
Код

$m2 = '$1+$2+$3'; # если такое выражение
$s =~ s/$m1/$m2/ee; # то нужно так

$m2 = '$1$2$3'; # а если такое
$s =~ s/$m1/qq("$m2")/ee; # то по другому
Возможно, есть еще варианты. Вопрос интересный и актуальный. Если у Вас или других форумчан есть универсальное решение, буду благодарен за его публикацию. И сам подумаю.
PM MAIL   Вверх
AlexPet
Дата 6.5.2008, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 5.12.2007
Где: Брянск

Репутация: нет
Всего: 1



amg, мне кажется, будет зависеть от того, чего хочет человек, пишущий заменяющее выражение.
Написав ".", он хочет вывести символ "точка" или конкатенировать строки?
А написав "+", он хочет сложить числа или вывести знак "плюс"?
Получается, что избрав "вывод символов как они есть" - нам нужно сначала интерполировать переменные, и уж потом делать все остальное - и поэтому принудительно делаем двойную вложенность кавычек - с помощью qq("выражение").
Если же хотим "выполнять" символы - то достаточно просто дважды выполнить заменяющую часть.

P.S. Спасибо за интересное замечание, раньше я об этом не задумывался smile
PM MAIL ICQ Jabber   Вверх
tishaishii
Дата 6.5.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: нет
Всего: 8



А откуда этот шаблон подстановок перётся?
Есть два варианта: при вводе шаблона использовать флаг типа вычислять чи ни или разработка отдельного синтаксиса, скорее всего, совпадающего с перл для евала, который описывает действия при подстановке.
PM MAIL ICQ Skype   Вверх
amg
Дата 7.5.2008, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: нет
Всего: 50



Цитата(AlexPet @  6.5.2008,  16:21 Найти цитируемый пост)
amg, мне кажется, будет зависеть от того, чего хочет человек, пишущий заменяющее выражение...
Да, конечно. И именно поэтому мой вопрос на самом деле не имеет смысла и аннулируется.

PM MAIL   Вверх
tolkien
Дата 9.5.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 5.4.2008

Репутация: нет
Всего: 4



У меня опять вопрос по интерполяции. Только уже в операторе поиска. Условия как прежде из внешнего файла считываются шаблоны. Только в этом случаи ненужно ничего заменять нужно только выдернуть данные. Решение нашел в гугле. Можно ли выполнить итерполяцию в этой строчке $res = eval "\"$m2\""; ,без использования eval?

Листинг3
Код


my $m1 = '(\d*\.?\d+) (\S+)';
my $m2 = '$2 $1'; 

my $s = '15.02 mm';

if ($s =~ m/$m1/)
{
   $res = eval "\"$m2\"";
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




[ Время генерации скрипта: 0.0518 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.