bri*_*foy 4 locale posix perl6
Perl 6 POSIX字符类是否尊重LOCALE?我正在玩一个程序,该程序将打印与POSIX char类匹配的所有字符,并且无论我设置了什么区域设置,它似乎总是打印相同的集合。如果我的语言环境是en_US.US-ASCII,我仍然会得到520ish的数字。同样令人烦恼的是,在Mac上执行此操作意味着我没有在其他地方找到酷的语言环境探索工具(或者,它们以不同的名称存在)。
这就是我需要在shell别名中输入的所有命令:
$ perl6 -e 'say join " ", map *.gist, $*VM, $*PERL, $*DISTRO, $*KERNEL'
moar (2016.10) Perl 6 (6.c) macosx (10.10.5) darwin (14.5.0)
Run Code Online (Sandbox Code Playgroud)
并且,该程序:
my $properties = set( <
alnum alpha ascii blank cntrl digit graph lower print graph punct
space upper word xdigit
> );
sub MAIN ( Str $property where * ? $properties = 'digit' ) {
say "NAME is " ~ %*ENV<NAME>;
say "LC_CTYPE is " ~ ( %*ENV<LC_CTYPE> // %*ENV<LC_ALL> );
say "property is $property";
use MONKEY-SEE-NO-EVAL;
my $pattern = EVAL "rx/ <$property> /";
say "regex is " ~ $pattern.gist;
show_chars( $pattern );
}
sub show_chars ( Regex $pattern ) {
for 0 .. 0x10FFFF -> $codepoint {
state $count = 0;
LAST { say "\nThere were $count characters" }
my $char = chr( $codepoint );
next unless $char ~~ $pattern;
$count++;
print "$char ";
print "\n" if $count %% 50;
}
}
Run Code Online (Sandbox Code Playgroud)
注意,我在程序中做了一个愚蠢的EVAL事情。我一直在寻找替代变量插值的方法rx。S05表示这是一件事情,但是没有文档,所以我想不是。我开始探索自己的令牌,但不得不继续前进。而且,现在我又问了一个关于插值的单独问题。
据我所知,Perl 6正则表达式不支持POSIX字符类。您提到的内置方法映射到Unicode属性或块(或类似的构造,请原谅我的Unicode无知),而且它们都不是特定于Locale的。
就EVAL而言,您可以这样消除它:
my $re_string = '<alpha>';
say 'a' ~~ rx / <$re_string> /;
Run Code Online (Sandbox Code Playgroud)