我有一个声明,其中汉字和英文字符彼此相邻:
我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]>/
那么如何匹配汉字?
答案 0 :(得分:13)
主要问题是\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 的字符。)