Perl |打印ASCII,但反向其他

时间:2017-01-18 10:08:31

标签: perl ascii utf

我希望打印95 ASCII ASCII符号不变,但其他人打印其代码。 如何在纯perl中制作它? '解压缩'功能?任何模块?

print BackSlashed('test folder'); # expected test\040folder

print BackSlashed('test тестовая folder'); 
# expected test\040\321\202\320\265\321\201\321\202\320\276\320\262\320\260\321\217\040folder

print BackSlashed('НОВАЯ ПАПКА');
# expected \320\235\320\236\320\222\320\220\320\257\040\320\237\320\220\320\237\320\232\320\220

sub BackSlashed() {
my $str = shift;
.. backslashed code here...
return $str
}

1 个答案:

答案 0 :(得分:3)

您可以使用带有evaled替换部分的正则表达式替换。在那里,首先需要convert each character to its numeric value,然后output it in octal notation。对它有一个很好的解释in this answer。附加转义后的反斜杠\以使其显示在输出中。

$str =~ s/([^a-zA-Z0-9])/sprintf "\\%03o", ord($1)/eg;

我将捕获组限制为基本的ASCII字母和数字。如果你想要别的东西,只需改变角色组。

由于您的示例输出具有八位字节但您说您的代码具有use utf8编译指示,因此您需要在运行替换之前将字符串的Perl表示形式转换为相应的八位字节序列。

use utf8;
my $str = 'НОВАЯ ПАПКА';
print foo($str);

sub foo { # note that there are no () here!
    my $str = shift;
    utf8::encode($str);
    $str =~ s/([^a-zA-Z0-9])/sprintf "\\%03o", ord($1)/eg;
    return $str;
}