如何在汉字和英文字符之间插入一个space?

How to insert a space between Chinese character and English character?

我有一个汉字和英文字符相邻的语句:

我Love Perl 6哈哈

我想在汉字和英文字符之间插入一个space:

我 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"
一

无论如何,您尝试使用的字符 class 并未涵盖所有汉字。

> '㒠' ~~  /<[\x4e00..\x9fa5]>/ 
Nil

您可能想要在脚本上进行匹配。

> '㒠' ~~  /<:Han>/
「㒠」

这样做的好处是,您不必在每次向 Unicode 添加一组新字符时都不断更改字符 class。


无论如何,您可以执行以下任一操作

# store in [=14=] and 
say S/(<:Han>)(<:Latin>)/[=14=] / given '我Love Perl 6哈哈'
say S{(<:Han>)(<:Latin>)} = "[=14=] " given '我Love Perl 6哈哈'
# same with subst
say '我Love Perl 6哈哈'.subst: /(<:Han>)(<:Latin>)/, {"[=14=] "}

# 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>)/[=15=] /;
$v ~~ s{(<:Han>)(<:Latin>)} = "[=15=] ";
$v ~~ s/<:Han> <()> <:Latin>/ /;

$v .= subst: /(<:Han>)(<:Latin>)/, {"[=15=] "};
$v .= subst: /<:Han> <()> <:Latin>/,' ';

请注意,<( 会导致它前面的所有内容都被忽略,)> 会忽略它后面的所有内容。 (可单独使用)。

您可能希望对后面的字符使用反向匹配。

S/<:Han> <( )> [ <!:Han> & <!space> ]/ /

(匹配一个既不是又不是space的字符。)