我希望打印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
}
答案 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;
}