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