in reply to Best practice on escapes in interpolated strings

Code-wise, the third option is the easiest to implement, at least if you pre-initialize your key-hash with a default:

my %values= ( '^' => '^', ); ... s!\^\(([^)]+)\)!$values{ $1 }!g;

Due to the selection of a default key of ^ with value ^, ^(^) gets replaced by ^ without any change to your code.

Of course, this approach isn't immediately applicable to your situation because you seem to want to dispatch method calls. A really nasty approach here would be to implement a ^ method in your object that returns the value ^, but that brings us deep into obfuscated territory, and the superficial simplicity of the code will certainly mystify the casual onlooker:

package My::Document; *{"My::Document::^"}= sub { "^" }; sub name { $_[0]->{name} }; sub fill_template { my( $self, $template )= @_; $template=~ s!\^\(([^)]+)\)!$self->$1()!ge; $template }; package main; my $t= bless { name => 'wanna_code_perl', } => My::Document; print $t->fill_template(<<TMPL); Hello ^(name). Escaped: ^(^). TMPL ;