2009-07-25 87 views

回答

6

的Unicode字符每个类的列表是从Unicode的规格时编译的Perl生成,并且典型地存储在/ usr/LIB/Perl的YOURPERLVERSION /单核/ LIB/gc_sc/

例如,匹配IsDigit(又名\ d)的Unicode字符范围列表存储在文件/usr/lib/perl-YOURPERLVERSION/unicore/lib/gc_sc/Digit.pl中

+0

谢谢,这几乎就是我正在寻找的东西。我仍然会对他们进行循环以建立一个列表,但至少这不会持续一整天。 – 2009-07-25 16:57:12

0

哪些字符/ \ d /匹配完全取决于您的正则表达式实现(虽然标准0-9保证)。在perl的情况下,perl locale用于定义哪些字符被认为是字母和数字。

+0

Perl的字符串转换为UTF8通过正则表达式引擎运行之前。 perl语言环境唯一影响的是如何将原始字节字符串转换为utf8。一旦字符串处于utf8中,perl将始终使用IsDigit的相同定义,而与locale无关。 – tetromino 2009-07-25 16:56:13

0

没有办法做到这一点,没有迭代通过所有的角色。 (如果你用它们创建一个巨大的字符串并使用正则表达式,你仍然必须至少执行一次循环来创建字符串)。

+0

令人高兴的是,部分Perl构建过程在libc目录下的`unicore`下创建了一组文件,这些文件夹已经为您完成了很多工作。我不知道他们是否是官方的,我对Perl 5 Porters列表有疑问,以确定它们是否安全。 – 2009-07-25 20:45:29

1

甚至比unicore/lib/gc_sc/Digit.pl更好的是unicore/To/Digit.pl。它是Unicode数字字符(以及它们的偏移量)与它们的数字值的直接映射。这意味着不是:

use Unicode::Digits qw/digit_to_int/; 

my @digits; 
for (split "\n", require "unicore/lib/gc_sc/Digit.pl") { 
    my ($s, $e) = map hex, split; 
    for (my $ord = $s; $ord <= $e; $ord++) { 
     my $chr = chr $ord; 
     push @{$digits[digits_to_int $chr]}, $chr; 
    } 
} 

for my $i (0 .. 9) { 
    my $re = join '', "[", @{$digits[$i]}, "]"; 
    $digits[$i] = qr/$re/; 
} 

我可以说:

my @digits; 
for (split "\n", require "unicore/To/Digit.pl") { 
    my ($ord, $val) = split; 
    my $chr = chr hex $ord; 
    push @{$digits[$val]}, $chr; 
} 

for my $i (0 .. 9) { 
    my $re = join '', "[", @{$digits[$i]}, "]"; 
    $digits[$i] = qr/$re/; 
} 

甚至更​​好:

my @digits; 
for (split "\n", require "unicore/To/Digit.pl") { 
    my ($ord, $val) = split; 
    $digits[$val] .= "\\x{$ord}"; 
} 
@digits = map { qr/[$_]/ } @digits; 
相关问题