regex Perl 6 POSIX字符类是否遵守LOCALE?

jhkqcmku  于 2022-12-19  发布在  Perl
关注(0)|答案(2)|浏览(119)

Perl 6 POSIX字符类是否尊重LOCALE?我曾经使用过一个程序,它会打印所有与POSIX char类匹配的字符,而且无论我设置什么语言环境,它似乎总是打印相同的字符集。我仍然能得到520位数,而且在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)

而且,程序:

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;
        }
    }

注意,我在程序中做了一个愚蠢的EVAL操作。我在rx中寻找变量插值的替代品。S05表明它是一个东西,但没有文档,所以我猜它不是。我开始探索我自己的令牌,但不得不继续前进。现在我问了a separate question about the interpolation

57hvy0tb

57hvy0tb1#

据我所知,Perl 6正则表达式不支持POSIX字符类,您提到的内置方法Map到Unicode属性或块(或类似的结构,请原谅我对Unicode的无知),而且它们都不是特定于Locale的。
就EVAL而言,您可以像这样将其删除:

my $re_string = '<alpha>';
say 'a' ~~ rx / <$re_string> /;
nkhmeac6

nkhmeac62#

2019年更新许多链接无法使用。有些是永久性的,有些是暂时的,有些有替代品。1

关于此答案:
谢谢你的工作!FWIW,我根本不关心语言环境。我只是看到了POSIX,很惊讶Perl 6会关心这个。- brian d foy
谢谢。我看到莫里茨在我开始之前已经回答了你的问题。但是我决定我想拼写repos等,寻找字符串'locale'的匹配项...然后我决定发布这些结果会很有用,而且它们在这里会更有用,在这里搜索perl 6和locale的人可能会找到它们,而不仅仅是作为个人要点。- raiph

在相关Perl 6和/或Rakudo文档中提及“语言环境”

我不是直接回答你关于POSIX和正则表达式的狭隘问题。莫里茨已经回答了这个问题。这篇文章只是我通过在各种repos等中搜索'locale'的匹配项来记录我对更一般问题“Perl 6和/或Rakudo中对 any locale特定处理有什么支持?”的广泛搜索。
这个“答案”结合了权威的来源和疯狂的猜测。如果它是有联系的,它是权威的。如果它是我的散文,它是疯狂的猜测。
在现有的公共模块列表中搜索“locale”将生成3个模块。事实上,没有一个模块会影响Perl 6的行为。
A google search of docs.perl6.org for 'locale'生成“您的搜索-站点:docs.perl6.org locale -不匹配任何文档。”
perl6.fail中搜索'locale'会产生一个bug报告。
A google search of the design/speculation docs产生三个感兴趣的结果:
1.一个locale方法。它看起来像是很久以前指定的方法,用来找出当前的操作系统区域设置是什么或诸如此类。A search of Rakudo's source for 'locale'产生零匹配。
1.提到故意 * 不 * 处理核心中的时间区域设置处理。
1.提到一个内置的规则<blank>,它匹配“一个”空白“字符--在大多数语言环境中,这对应于空格和制表符。”这个规则是作为NQP中Cursor类上的blank方法实现的。代码say so " \t" ~~ / <blank>+ /使用我的系统返回True
A search of NQP's source for 'locale'产生零匹配。
A search of MoarVM's repo for 'locale'在第三方GCC库(可移植原子操作的库;我不知道为什么这样的代码应该关心locale)。
在谷歌上搜索#perl6中的'locale'会得到一堆提及,包括:

  • 2007年今天:“在标准的unicode级别...... locale是完全忽略的”。以及“但是如果你要求依赖于语言的字符处理,你可以要求它注意locale”。(我认为还没有人写过后者所必需的代码。)
  • 2008当莫里茨(他写了上面这个问题的另一个答案)问到“知道Perl 6中将如何处理语言环境吗?"时,没有人回答。
  • 2012 TimToady说“我们倾向于强烈地不喜欢地点”。
  • 2016年“一些日期、数字等标准区域设置的东西会很有用”
  • 2016“我不认为我们有数字的区域设置感知格式”。
  • 2016“Perl 6不处理任何特定于语言环境的东西,比如土耳其语特例AFAIK。”

脚注

1这个答案中的很多环节在2019年都被打破了:

  • perl6.fail永远消失了。请使用rt bug跟踪器、perl 6队列和gh问题队列来代替perl 6和rakudo。rt跟踪器将消失,当前为只读。
  • design.perl6.org现在已经关闭了,也许是永久性的。我知道最好的替代品是archive.org。但是afaik不能跨页面搜索。
  • irclog.perlgeek.de的链接已经永久关闭。我知道最好的替代品是colabti's irclog,它可以追溯到2009年左右。(莫里茨的perlgeek数据可以追溯到2005年。)使用URL中的日期Map到colabti的日志。

相关问题