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

Поиск:

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


Новичок



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

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



Доброго дня всем!!!

есть файл где прописаны все замены

Код

Россия \t Вести-Москва \t Вести \n

Скрипт ищет канал (Россия), ищет что менять (Вести-Москва) на что поменять (Вести)
меняется одной строкой.
Код

~= s/$old/$new/


Но мне бы хотелось задействовать замену с поиском
а именно:
Код

Спорт \t Футбол.*(".*" - ".*").* \t $1

Т.е. Хочу поменять строку (Футбол.......("Спартак" - "Челси")ююююююю) на ("Спартак" - "Челси")
все тойже конструкцией
Код

~= s/$old/$new/

Но не выходит каменный цветок
PM MAIL   Вверх
amg
Дата 27.11.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Не очень понятно, что нужно сделать. Если так?
Код
$str = qq/Спорт \t Футбол \t ("Спартак" - "Челси")ююююююю/;
$pat = qr/Спорт\s+Футбол.*(".+?"\s*-\s*".*?").*/;
$str =~ s/$pat/Спорт Футбол $1/;
print "$str\n";

PM MAIL   Вверх
ginnie
Дата 27.11.2008, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



platonische, можно попробовать так

Код

~= s/$old/$new/ee


модификатор /ee выполняет подстановку значения переменной $new, после чего делает eval() этого значения.

Это сообщение отредактировал(а) ginnie - 27.11.2008, 13:14


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
platonische
Дата 27.11.2008, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ginnie, не помогло.

Я немного и вправду обрисовал некачественно.
суть всего ...
есть файл где прописаны замены (т.е. что на что менять)
когда я начинаю перебирать записи я смотрю есть ли в файле замены такая запись, если есть то меняю.
Легко меняю (ВЕсти-Москва) на (Вести) и все тому подобное (статическое)
сложность появилась с непостоянными но регулярными выражениями (эх)
Есть строка в исходнике
Футбол. "Спартак"(Москва) - "Зенит"(Санкт-Петербург). Финал. Прямая трансляция.
надо поменять на Футбол. "Спартак" - "Зенит"
и поэтому в файле замены хочу прописать регулярное выражение с поиском
Код

~= s/Футбол.*(".*").*(".*").*/Футбол.$1 - $2/; 


все бы ничего... но вот мне приходится подставлять т.к. читаю с файла
и примерно это можно интерпретировать след.образом:
Код

$old = "Футбол.*(".*").*(".*").*";
$new = "Футбол.$1 - $2";
~= s/$old/$new/;


в выходном фале получаю Футбол.$1 - $2.
PM MAIL   Вверх
ginnie
Дата 28.11.2008, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



platonische, а что получается с 

Код

s/$old/$new/ee


?

P.S.  

Код

$old = "Футбол.*(".*").*(".*").*";


так неверно, кавычки внутри не экранированы, лучше так

Код

$old = 'Футбол.*(".*").*(".*").*';


P.P.S. Фрагмент

Код

$new = "Футбол.$1 - $2";


тоже неверный, т.к. произойдет интерполяция переменных $1 и $2. Надо написать в неинтерполирующих кавычках, например

Код

$new = 'Футбол.$1 - $2';


P.P.P.S. Предлагаю новый вариант (взять заменяющее выражение в дополнительные кавычки)

Код

Спорт \t Футбол.*(".*" - ".*").* \t "Футбол.$1 - $2"


для

Код

s/$old/$new/ee


Это сообщение отредактировал(а) ginnie - 28.11.2008, 00:23


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
amg
Дата 28.11.2008, 08:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(ginnie @  28.11.2008,  00:12 Найти цитируемый пост)
Предлагаю новый вариант (взять заменяющее выражение в дополнительные кавычки)
ginnie, мне кажется, лучше в файле шаблонов не приводить образцы с учетом того, что они потом будут исполняться с модификаторами ee -- легко запутаться. Представляется целесообразным давать там "обычные" образцы, типа того, что привел platonische, и парсить их в программе (а парсить все равно придется, т.к. перл будет по меньшей мере ругаться при исполнении s/$old/$new/ee на обычных заменах).
Код
$str = 'Футбол. "Спартак"(Москва) - "Зенит"(Санкт-Петербург). Финал. Прямая трансляция.';
$_ = '~= s/Футбол.*(".*").*(".*").*/Футбол.$1 - $2/;';

if (/^~=/) {
  my ($old, $new) = (split '/')[1,2];
  $str =~ s/$old/'"'.$new.'"'/ee;
} else {
  # Если $_ = "Россия \t Вести-Москва \t Вести \n";
  my ($old, $new) = map {s/^\s+//; s/\s+$//; $_} (split "\t")[1,2];
  $str =~ s/$old/$new/;
}

print "$str\n";


PM MAIL   Вверх
ginnie
Дата 28.11.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



amg, ты прав!
И по поводу 
Код

$str =~ s/$old/'"'.$new.'"'/ee;

ты здорово придумал, мне что-то в голову не пришло  smile 

Это сообщение отредактировал(а) ginnie - 28.11.2008, 10:31


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


 




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


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

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