\uXXXX
не имеет отношения к Punycode / IDN вообще.Похоже, что строковый формат JSON представляет символы Юникода, и вам нужно использовать правильные инструменты для них.
Во-первых, вы должны избегать обратной косой черты внутри двойных кавычек или использовать одинарные кавычки.
Есливам не нужно иметь дело с суррогатными парами, вы можете просто конвертировать числа в символы юникода.
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
my $fqdn = '\u043f\u0441\u0438\u0445\u043e\u0442\u0435\u0440\u0430\u043f\u0438\u044f.net';
$fqdn =~ s/\\u([[:xdigit:]]{4})/chr(hex($1))/ge;
print encode_utf8 $fqdn;
print "\n";
Если вам нужно учесть их, вы все равно можете конвертировать без CPAN-модулей без CORE.
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Encode;
my $fqdn = '\u043f\u0441\u0438\u0445\u043e\u0442\u0435\u0440\u0430\u043f\u0438\u044f.net';
my $re_hex = qr/[[:xdigit:]]{4}/;
my $re_uni = qr/\\u$re_hex/;
my $re_uni_capture = qr/\\u($re_hex)/;
$fqdn = join q{}, map {
/^$re_uni/
? decode 'utf-16-be', pack "n*", map { hex } m/$re_uni_capture/g
: $_
} split qr/(${re_uni}*)/, $fqdn;
print encode_utf8 $fqdn;
print "\n";
PS: Пожалуйста, кто-нибудь исправит мой плохой английский, спасибо