say unpack("H*", pack("H*", "41424320202020200A200B000C") =~ s/[^\t[:print:]]//arg);
или
my $hex = "41424320202020200A200B000C";
my $bytes = pack("H*", $hex);
$bytes =~ s/[^\t[:print:]]//ag;
$hex = unpack("H*", $bytes);
say $hex;
или
my $hex = "41424320202020200A200B000C";
my $bytes = pack("H*", $hex);
$bytes =~ s/[^\t\x20-\x7E]//g;
$hex = unpack("H*", $bytes);
say $hex;
Решения, использующие /a
и /r
, требуют Perl 5.14 +.
Сказанное начинается со следующей строки:
41424320202020200A200B000C
Преобразуется в следующее с помощью pack
:
ABC␠␠␠␠␠␊␠␋␀␌
Подстановка удаляет все не-ASCII и все непечатаемые символы, кроме TAB, оставляя нам следующее:
ABC␠␠␠␠␠␠
Преобразуется в следующее с помощью unpack
:
414243202020202020
Это решение не только короче, чем предыдущие решения, но и быстрее, поскольку оно распределяет гораздо меньше переменных и запускает совпадение с регулярным выражением только один раз.