есть ли в regexp аналог Replace( Str_where, Str_what, Str_with) ?
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



есть ли в regexp аналог Replace( Str_where,... Expand / Collapse
Автор
Сообщение
02.02.2005 19:29
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 13.06.2006 15:18
Сообщ.: 7, Visits: 79
есть переменные
$str_where = "select t.*, rownum from dual t where exists (select * from dual where '1'<>'0') ";

$str_what = "(select * from dual where '1'<>'0')";
$str_with = "__REPLACED_SUBQUERY__";

есть ли возможность получить в результате строку
"select t.*, rownum from dual t where exists __REPLACED_SUBQUERY__"

заранее спасибо за помощь.
Сообщ. #855531
02.02.2005 20:44
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 13.06.2006 15:18
Сообщ.: 7, Visits: 79
уточню:

$str_where =~ s/$str_what/__STR_WITH__/;

не подойдет, т.к. в ходе поиска специальные значения символов
()/\{}*.? etc. etc.
мешают.
Сообщ. #855543
03.02.2005 9:28
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 13.07.2006 17:05
Сообщ.: 124, Visits: 1 356
Нет ничего невозможного. В Perl для этого идеально подходят хэши.
На вскидку - можно сделать так:

$str_where = "select t.*, rownum from dual t where exists _REPLACE_THIS_";
my %HASH;

$HASH{'_REPLACE_THIS_'}= "(select * from dual where '1'<>'0')";

foreach my $key(keys %HASH) {

$str_where= ~s/$key/$HASH{$key}/;

}

Надеюсь эействие кода понятно.


PerlMonks.Org.Ru.... coming soon
Сообщ. #855575
03.02.2005 12:43
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 13.06.2006 15:18
Сообщ.: 7, Visits: 79
но код делает не то, что нужно.
(действие кода понятно. )

вот "измененный под задачу" код - обратите внимание, что ключ хеша, а не значение, содержит символы, трактуемые в s/// как специальные символы паттерна.

Виноват, сразу не акцентировал проблему - необходимо _игнорировать_ специальные значения символов в паттерне s/$here/$not_there/

########################################
$str_where = "select t.*, rownum from dual t where exists (select * from dual where '1'<>'0')";
my %HASH;

$HASH{"(select * from dual where '1'<>'0')"} = "_Must_Be__";

foreach my $key(keys %HASH) {
$str_where =~ s/$key/$HASH{$key}/;
}
print $str_where;
########################################
# - желаемый рез-т :
# select t.*, rownum from dual t where exists _Must_Be__
#

спасибо за ответ.
Сообщ. #855643
04.02.2005 18:38
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 28.04.2006 10:09
Сообщ.: 80, Visits: 882
попробуй
s/quotemeta($here)/$not_there/
Сообщ. #855971
04.02.2005 18:39
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 28.04.2006 10:09
Сообщ.: 80, Visits: 882
т.е.

$here = quotemeta($here);
s/$here/$not_there/
Сообщ. #855972
07.02.2005 11:45
новичок

новичокновичокновичокновичокновичокновичокновичокновичок

участник
Last Login: 13.06.2006 15:18
Сообщ.: 7, Visits: 79
спасибо за решение.
btw, если интересно, еще альтернатива, с использованием substr в левой части:

substr( $chg_where, index ($chg_where, $chg_what), length($chg_what) ) = "__SUBGRP__";
Сообщ. #856265
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 1:31