2009-07-25 1 views
6

すべてのUnicode文字をループしないで、特定のプロパティを持つ文字のリストを取得するにはどうすればよいですか?特に、数字(つまり/\d/に一致する文字)のすべての文字のリストが必要です。私はUnicode::UCDを見てきました、そして、それは与えられた文字の特性を決定するのに便利ですが、そこからプロパティを持つリスト文字を得る方法はないようです。特定のプロパティを持つすべてのUnicode文字のリストを取得するにはどうすればよいですか?

答えて

6

各クラスのUnicode文字のリストは、あなたがPerlをコンパイルするときにUnicodeの仕様から生成され、典型的には、例えばは/ usr/libに/ perlの-YOURPERLVERSION/UNICORE/libに/ gc_sc/

に保存されていますIsDigit(別名\ d)と一致するUnicode文字範囲のリストは、/usr/lib/perl-YOURPERLVERSION/unicore/lib/gc_sc/Digit.plファイルに格納されます。

+0

ありがとう、これは私が探していたものとほぼ同じです。私はまだリストを構築するためにそれらの上にループを持っていますが、少なくともそれは永遠と一日かかることはありません。 –

0

文字/ d/matchは正規表現の実装に完全に依存します(標準0-9は保証されます)。 perlの場合、perl localeは、どの文字がアルファベットと数字とみなされるかを定義するために使用されます。

+0

Perlは正規表現エンジンを介してそれらを実行する前にUTF8に文字列を変換します。 perlのロケールが影響するのは、生のバイト文字列をutf8に変換する方法だけです。文字列がutf8になると、perlは常にロケールとは無関係にIsDigitと同じ定義を使用します。 – tetromino

0

反復せずに行う方法はありませんすべての文字を介して。 (それらのすべてで巨大な文字列を作成し、正規表現を使用する場合は、文字列を作成するために少なくとも1回ループを実行する必要があります)。

+0

Perlビルドプロセスの幸いな部分は、既に多くの作業が行われているlibディレクトリの1つに 'unicore'の下に一連のファイルを作成します。私は彼らが公式かどうかわからない、私はPerl 5 Portersのリストに質問して、それらを使うのが安全かどうかを調べる。 –

1

さらにunicore/lib/gc_sc/Digit.plunicore/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; 
関連する問題