|
|
|
новичок
      
участник
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__"
заранее спасибо за помощь.
|
|
|
|
|
новичок
      
участник
Last Login: 13.06.2006 15:18
Сообщ.: 7,
Visits: 79
|
|
уточню:
$str_where =~ s/$str_what/__STR_WITH__/;
не подойдет, т.к. в ходе поиска специальные значения символов ()/\{}*.? etc. etc. мешают.
|
|
|
|
|
Supreme 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
|
|
|
|
|
новичок
      
участник
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__ #
спасибо за ответ.
|
|
|
|
|
Supreme Being
      
участник
Last Login: 28.04.2006 10:09
Сообщ.: 80,
Visits: 882
|
|
попробуй s/quotemeta($here)/$not_there/
|
|
|
|
|
Supreme Being
      
участник
Last Login: 28.04.2006 10:09
Сообщ.: 80,
Visits: 882
|
|
т.е.
$here = quotemeta($here); s/$here/$not_there/
|
|
|
|
|
новичок
      
участник
Last Login: 13.06.2006 15:18
Сообщ.: 7,
Visits: 79
|
|
спасибо за решение. btw, если интересно, еще альтернатива, с использованием substr в левой части:
substr( $chg_where, index ($chg_where, $chg_what), length($chg_what) ) = "__SUBGRP__";
|
|
|
|