Строки, прочитанные из файла, имеют символ Unicode шестнадцатеричное представление , но не сам символ (последовательность байтов, представляющая символ).
Строка требует замены символа Unicode шестнадцатеричное представление с самим символом.
Следующий фрагмент кода демонстрирует два способа достижения желаемого результата.
#!/usr/bin/perl
#
# vim: ai:ts=4:sw=4
#
use strict;
use warnings;
use feature 'say';
use Encode;
use utf8;
binmode STDOUT, ":utf8";
my @lines = (
"Hello \x{2744}!",
"Hello ❄!"
);
while(my $line0=<DATA>) {
chomp $line0;
my $line1 = $line0;
$line0 =~ s/\\x\{([\da-z]+)\}/decode('UTF-16',pack('H4',$1))/ieg;
$line1 =~ s/\\x\{([\da-z]+)\}/chr(hex($1))/ieg;
push @lines, $line0;
push @lines, $line1;
}
say for @lines;
__DATA__
Hello \x{2744} you need \x{2602} to go under \x{2600}
Danger \x{2622} doctor Robinson, danger \x{2622}
Вывод
Hello ❄!
Hello ❄!
Hello ❄ you need ☂ to go under ☀
Hello ❄ you need ☂ to go under ☀
Danger ☢ doctor Robintson, danger ☢
Danger ☢ doctor Robintson, danger ☢