Perl 6 POSIX字符类是否尊重LOCALE?

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表示这是一件事情,但是没有文档,所以我想不是。我开始探索自己的令牌,但不得不继续前进。而且,现在我又问了一个关于插值的单独问题

mor*_*itz 6

据我所知,Perl 6正则表达式不支持POSIX字符类。您提到的内置方法映射到Unicode属性或块(或类似的构造,请原谅我的Unicode无知),而且它们都不是特定于Locale的。

就EVAL而言,您可以这样消除它:

my $re_string = '<alpha>';
say 'a' ~~ rx / <$re_string> /;
Run Code Online (Sandbox Code Playgroud)

  • 由moritz在https://github.com/perl6/doc/commit/5b79e4988c1417ee94e417335bf3edbba3016d06中修复 (2认同)