Почему вы хотите создавать свои sql-запросы, жестко кодируя строки, а затем заменяя их? Не было бы что-то вроде
my $proto_query = <<'EOQ'
select ... where %s ...
EOQ
my $query = sprintf $proto_query, 'users.fake = -1 AND ...';
или (желательно, поскольку это позволяет избежать многих проблем, которые есть у вашего первоначального подхода и вышеизложенного) с помощью модуля, такого как Data::Phrasebook::SQL
, сделать многое проще?
Если вы действительно хотите использовать подстановку строк, вы, вероятно, ищете что-то вроде
my $foo = "foo bar where baz where moo";
$foo =~ s/(.*)where/$1where affe and/;
say $foo; # "foo bar where baz where affe and moo"
То есть, захватывая как можно больше, пока вы не сможете больше захватывать, не имея «где», сразу же следуйте тому, что вы захватили, и затем вставляете то, что вы захватили, снова захваченным, плюс любые модификации, которые вы хотите внести.
Однако обратите внимание, что это имеет различные ограничения, если вы используете это для манипулирования SQL-запросами. Чтобы сделать все правильно, вы должны понимать SQL на некотором уровне. Рассмотрим, например, select ... where user.name = 'where'
.