Вам не нужен хеш, если вы заменяете каждый символ на себя, которому предшествует обратная косая черта.Просто выберите то, что вам нужно, и поставьте перед ним обратную косую черту:
s/($re)/"\\$1"/eg;
Чтобы создать регулярное выражение для всех символов, Regexp :: Assemble действительно хорошо.
use v5.10.1;
use Regexp::Assemble;
my $ra = Regexp::Assemble->new;
my @specials = qw(_ $ { } # % & );
foreach my $char ( @specials ) {
$ra->add( "\\Q$char\\E" );
}
my $re = $ra->re;
say "Regex is $re";
while( <DATA> ) {
s/($re)/"\\$1"/eg;
print;
}
__DATA__
There are $100 dollars
Part #1234
Outside { inside } Outside
Обратите внимание, как в первой строке ввода Regexp :: Assemble перестроил мой шаблон.Это не просто склеенные биты частей, которые я добавил:
Regex is (?^:(?:[#$%&_]|\{|\}))
There are \$100 dollars
Part \#1234
Outside \{ inside \} Outside
Если вы хотите добавить больше символов, вы просто помещаете символ в @specials
.Все остальное происходит за вас.