Основная проблема в том, что \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> ]/ /
(Соответствует символу, который одновременно не является Хан и не является пробелом.)
person
Brad Gilbert
schedule
11.07.2018
/<[\u4e00..\u9fa5]>/
совпадает с/<[..00459\a\efuu]>/
или/<[a0049f.euu\5\.]>/
- person Brad Gilbert   schedule 11.07.2018