我想用破折号替换变量中某些 Unicode 值的字符。我有两个可能可行的想法,但我不知道如何检查字符的值:
1/ 将变量处理为字符串,检查每个字符的值并将这些字符放入一个新变量中(替换那些无效的字符)
2/使用这些魔法:-)
$variable = s/[$char_range]/-/g;
char_range 应该类似于[0-9]
or [A-Z]
,但它应该是 utf-8 字符的值。准确地说,我需要从 0x00 到 0x7F 的范围。
没有 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/-/;
下面的表达式应该用连字符替换任何不是 ASCII 的东西,这是(我认为)你想要做的:
s/[\N{U+0080}-\N{U+FFFF}]/-/g