Ответ, отправленный @toskv, кажется, что ваш сервис возвращает наблюдаемое, а не наблюдаемое. Вы должны проверить свои типы и apis, чтобы убедиться, что вы правильно интерпретируете ответы.
Используйте quotemeta:
$pat = quotemeta($arr[1]) . '(.*?)' . quotemeta($arr[2]);
if ($src =~ $pat)
print $1;
Попробуйте функцию quotemeta Perl. С другой стороны, используйте \Q
и \E
в Вашем regex для выключения интерполяции значений в regex. См. perlretut для больше на \Q
и \E
- они не могут быть тем, что Вы ищете.
quotemeta выходит из метасимволов, таким образом, они интерпретируются как литералы. Как ярлык, можно использовать \Q...\E в двойном-quotish контексте для окружения материала, который должен быть заключен в кавычки:
$pat = quotemeta($arr[1]).'(.*?)'.quotemeta($arr[2]);
if($src=~$pat) { print $1 }
или
$pat = "\Q$arr[1]\E(.*?)\Q$arr[2]"; # \E not necessary at the end
if($src=~$pat) { print $1 }
или просто
if ( $src =~ /\Q$arr[1]\E(.*?)\Q$arr[2]/ ) { print $1 }
Обратите внимание, что это не ограничено интерполированными переменными; буквенные символы затронуты также:
perl -wle'print "\Q.+?"'
\.\+\?
хотя, очевидно, это происходит после интерполяции переменной, таким образом, "\Q$foo" не становится '\$foo'.