The Perl and Raku Conference 2025: Greenville, South Carolina - June 27-29 Learn more

#!perl
use strict;
no warnings 'utf8';
sub unidump { join(' ', map { sprintf '%04X', $_ } unpack 'U*', shift) }
sub element {
my $s = shift;
my $u = unidump($s);
for ($u) {
s/\b00([46][1-9A-F]|[57][0-9A])\b/'{'.chr(hex $1).'}'/ge;
s/\ \{/{/g;
s/\}\ /}/g;
s/\}\{//g;
}
return $u;
}
sub string {
my $s = shift;
my $ret = '"';
my @c = split //, $s;
for (@c) {
if (/^[\x20-\x7E]\z/) {
$ret .= "\\" if !/^[0-9A-Za-z_]\z/;
$ret .= $_;
} elsif (/^[\x80-\xFF]\z/) {
my $temp = @c == 1 ? "'U'" : "'U*'";
my $hexa = join ', ', map sprintf("0x%X", $_), unpack('U*', $s);
return "pack($temp, $hexa)";
} else {
$ret .= sprintf '\x{%X}', unpack 'U', $_;
}
}
$ret .= '"';
return $ret;
}
1;