Вы можете сделать это с помощью 'eval':
my $string = 'hello\tworld\n';
my $decoded_string = eval "\"$string\"";
Обратите внимание, что с этим подходом связаны проблемы безопасности, если у вас нет 100% контроля над входной строкой.
Редактировать: Если вы хотите ТОЛЬКО интерполировать \ x подстановки (а не общий случай «что-то, что Perl будет интерполировать в строке в кавычках»), вы можете сделать это:
my $string = 'hello\tworld\n';
$string =~ s#([^\\A-Za-z_0-9])#\\$1#gs;
my $decoded_string = eval "\"$string\"";
Это почти то же самое, что и quotemeta, но освобождает символы \ от экранирования.
Edit2: Это все еще не на 100% безопасно, потому что, если последний символ - «\» - он будет «просачиваться» за конец строки, хотя ...
Лично, если бы я хотел быть на 100% безопасным, я бы сделал хеш с теми подпрограммами, которые я специально хотел, и использовал бы замену регулярного выражения вместо eval:
my %sub_strings = (
'\n' => "\n",
'\t' => "\t",
'\r' => "\r",
);
$string =~ s/(\\n|\\t|\\n)/$sub_strings{$1}/gs;