Как вставить пробел между китайским иероглифом и английским иероглифом?

У меня есть утверждение, в котором китайский иероглиф и английский иероглиф находятся рядом друг с другом:

我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]>/

так как сопоставить китайский иероглиф?


person chenyf    schedule 11.07.2018    source источник
comment
/<[\u4e00..\u9fa5]>/ совпадает с /<[..00459\a\efuu]>/ или /<[a0049f.euu\5\.]>/   -  person Brad Gilbert    schedule 11.07.2018
comment
Разве сопоставление свойства Script не было бы лучше? Вообще-то не уверен, что сможем.   -  person Elizabeth Mattijsen    schedule 11.07.2018


Ответы (1)


Основная проблема в том, что \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
comment
perl6 -e 'say 我Love Perl 6哈哈.subst(/(‹:Han›)(‹:Latin›)/, {$0 $1})' -- печатает -- 我 Love Perl 6哈哈. Только некоторое знакомство с тематикой. - person mr_ron; 11.07.2018
comment
@mr_ron Это можно упростить, если вы использовали <( и )> - person Brad Gilbert; 11.07.2018