我有一个中文和英文字符相邻的声明:
我Love Perl 6哈哈
我想在中文和英文之间插入一个空格:
我 Love Perl 6 哈哈
我搜索\u4e00-\u9fa5
代表汉字:
'哈' ~~ /<[\u4e00..\u9fa5]>/
但是结果是:
Potential difficulties:
Repeated character (0) unexpectedly found in character class
at line 2
------> '哈' ~~ /<[\u4e00..\⏏u9fa5]>/
如何匹配汉字?
\u
不是有效的转义。> "\u4e00"
===SORRY!=== Error while compiling:
Unrecognized backslash sequence: '\u'
------> "\⏏u4e00"
\x
是。
> "\x4e00" 一
无论如何,您尝试使用的字符类并不能覆盖所有汉字。
> '㒠' ~~ /<[\x4e00..\x9fa5]>/ Nil
您可能想要在脚本上进行匹配。
> '㒠' ~~ /<:Han>/ 「㒠」
这样做的好处是,每次将新的字符集添加到Unicode时,您不必一直更改字符类。
无论如何,您可以执行以下任何操作
# store in $0 and $1 say S/(<:Han>)(<:Latin>)/$0 $1/ given '我Love Perl 6哈哈' say S{(<:Han>)(<:Latin>)} = "$0 $1" given '我Love Perl 6哈哈' # same with subst say '我Love Perl 6哈哈'.subst: /(<:Han>)(<:Latin>)/, {"$0 $1"} # only match between the two say S/<:Han> <( )> <:Latin>/ / given '我Love Perl 6哈哈' say S{<:Han> <( )> <:Latin>} = ' ' given '我Love Perl 6哈哈'
要更改变量中的值,请使用s///
或.=subst
my $v = '我Love Perl 6哈哈'; $v ~~ s/(<:Han>)(<:Latin>)/$0 $1/; $v ~~ s{(<:Han>)(<:Latin>)} = "$0 $1"; $v ~~ s/<:Han> <()> <:Latin>/ /; $v .= subst: /(<:Han>)(<:Latin>)/, {"$0 $1"}; $v .= subst: /<:Han> <()> <:Latin>/,' ';
请注意,<(
会忽略之前的所有内容,而)>
会对之后的所有内容执行相同的操作。 (可以单独使用)。您可能想对后面的字符使用反向匹配。
S/<:Han> <( )> [ <!:Han> & <!space> ]/ /
(同时匹配不是Han而不是space的字符。)