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。
2条答案
按热度按时间57hvy0tb1#
据我所知,Perl 6正则表达式不支持POSIX字符类,您提到的内置方法Map到Unicode属性或块(或类似的结构,请原谅我对Unicode的无知),而且它们都不是特定于Locale的。
就EVAL而言,您可以像这样将其删除:
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'会得到一堆提及,包括:
脚注
1这个答案中的很多环节在2019年都被打破了: