\uXXXX
is not related with Punycode/IDN at all. It seems like JSON string format that represents Unicode characters and you need to use right tools for them.
First off, you have to escape backslashes inside double quotes, or use single quotes.
If you don't need dealing with surrogate pairs, you can simply convert numbers to unicode characters.
#!/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";
If you have to consider them, you still can convert without non-CORE CPAN modules.
#!/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: Please someone correct my poor English, thanks