1

我想用破折号替换变量中某些 Unicode 值的字符。我有两个可能可行的想法,但我不知道如何检查字符的值:

1/ 将变量处理为字符串,检查每个字符的值并将这些字符放入一个新变量中(替换那些无效的字符)

2/使用这些魔法:-)

$variable = s/[$char_range]/-/g;

char_range 应该类似于[0-9]or [A-Z],但它应该是 utf-8 字符的值。准确地说,我需要从 0x00 到 0x7F 的范围。

4

2 回答 2

2

没有 UTF-8 字符之类的东西。只有您编码为 UTF-8 的字符。即使这样,您也不想在 Perl 所知道的神奇范围之外创建范围。你可能会得到比你预期更多的东西。

要获取字符的序数值,请使用ord

 use utf8;
 my $code_number = ord '';  # U+1F638

 say sprintf "%#x", $code_number;

但是,我认为这不是您所需要的。听起来您想将 ASCII 范围内的字符替换为-. 您可以指定代码范围:

 s/[\000-\177]/-/g;  # in octal
 s/[\x00-\x7f]/-/g;  # in hexadecimal

您可以在大括号中指定宽字符序数值:

 s/[\x80-\x{10ffff}]/-/g;  # wide characters, replace non-ASCII in this case

当字符具有共同属性时,您可以使用它:

 s/\p{ASCII}/-/g;

但是,如果您要逐个字符地替换事物,则可能需要音译:

$string =~ tr/\000-\177/-/;
于 2012-04-06T21:14:54.503 回答
2

下面的表达式应该用连字符替换任何不是 ASCII 的东西,这是(我认为)你想要做的:

s/[\N{U+0080}-\N{U+FFFF}]/-/g
于 2012-04-06T19:41:00.693 回答