quotemeta экранирует метасимволы, поэтому они интерпретируются как литералы. В качестве ярлыка вы можете использовать \ Q ... \ E в контексте двойных кавычек для окружения того, что должно быть заключено в кавычки:
$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".