Perl 6 POSIX角色类是否尊重LOCALE?我正在玩一个程序,可以打印匹配POSIX char类的所有字符,无论我设置我的语言环境,它似乎总是打印相同的集合。如果我的语言环境是en_US.US-ASCII
,我仍然会得到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。
答案 0 :(得分:4)
据我所知,Perl 6正则表达式不支持POSIX字符类。您提到的内置方法映射到Unicode属性或块(或类似的构造,请原谅我的Unicode无知),并且它们都不是特定于区域设置的。
就EVAL而言,你可以像这样摆脱它:
my $re_string = '<alpha>';
say 'a' ~~ rx / <$re_string> /;
答案 1 :(得分:1)
关于这个答案:
感谢您的工作! FWIW,我根本不关心语言环境。我刚刚看到&#34; POSIX&#34;并且感到惊讶的是Perl 6会关心这一点。 - brian d foy
感谢。在我开始之前,我看到Moritz已经回答了你的问题。但是我决定我要搜索repos等,寻找字符串&#39; locale&#39;的匹配项。 ...然后我决定发布这些结果会很有用,并且在这里它们会更有用,搜索perl6和locale的人可能会找到它们,而不仅仅是个人要点。 - raiph
我没有直接解决有关POSIX和正则表达式的狭隘问题。莫里茨回答了这个问题。这篇文章只是我记录了我对广泛搜索的更广泛问题的答案&#34;对于Perl 6和/或Rakudo中任何区域设置特定处理有什么支持?&#34;通过搜索&#39; locale&#39;的匹配在各种回购等。
这个&#34;答案&#34;将确定的消息来源与狂野的猜测相结合。如果它是相互关联的,那么它是最终的。如果这是我的散文,那就是疯狂的猜测。
A search for 'locale' in the existing public module list产生3个模块。 Afaict,没有影响Perl 6的行为。
A google search of docs.perl6.org for 'locale'产生&#34;您的搜索网站:docs.perl6.org区域设置 - 与任何文档都不匹配。&#34;
页面内搜索&#39;区域设置&#39;在perl6.fail处产生一个bug report。
A google search of the design/speculation docs产生三个感兴趣的结果:
locale
方法。它看起来像很久以前指定的方式来找出当前操作系统的区域设置或某些东西。 A search of Rakudo's source for 'locale'产生零匹配。
提及故意不处理核心中的时间区域设置处理。
提及内置规则<blank>
,其匹配&#34;单个&#39;空白&#39; character - 在大多数语言环境中,这对应于空格和制表符。&#34;。此规则实施为the blank method on the Cursor class in NQP。代码say so " \t" ~~ / <blank>+ /
使用我的系统返回True
。
A search of NQP's source for 'locale'产生零匹配。
A search of MoarVM's repo for 'locale'在第三方GCC libatomic库(一个可移植的原子操作库中产生匹配;我不知道为什么这些代码应该关心locale
)。
A google search for 'locale' in #perl6会产生一系列提及,包括:
2007 TimToady:"at the standard unicode level ... locales are completely ignored"。并且&#34;但是如果你要求语言相关的字符处理,你可以要求它注意语言环境&#34;。 (我认为还没有人为后者编写必要的代码。)
2008当他问"any idea how locales will be handled in Perl 6?"时,没有人回答莫里茨(他在上面这个问题上写了另一个答案)。
2012 TimToady说"we tend to dislike locales intensely"。
2016 "some standard locale stuff for dates, numbers and stuff would be useful"
2016 "i don't think we have locale-aware formatting of numbers"。
2016 "Perl 6 doesn't handle anything locale-specific such as those Turkish special cases AFAIK."