佩尔 |打印 ASCII,但反斜杠其他

Perl | Print ASCII, but backslashed other

我想打印 95 个 ASCII 符号不变,但让其他人打印其代码。 如何在纯perl中制作它? 'unpack'函数?任何模块?

print BackSlashed('test folder'); # expected test0folder

print BackSlashed('test тестовая folder'); 
# expected test012051112060200170folder

print BackSlashed('НОВАЯ ПАПКА');
# expected 050602000700700070200

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

您可以使用带评估替换部分的正则表达式替换。在那里,需要convert each character to its numeric value first, and then output it in octal notation. There's a good explanation for it in this answer。附上转义的反斜杠 \ 以使其显示在输出中。

$str =~ s/([^a-zA-Z0-9])/sprintf "\%03o", ord()/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()/eg;
    return $str;
}