[1] Perl 5.8 以降では、 \p{InFooSet}
や
\P{InFooSet}
という文字クラスが正規表現で使えます。例えば、 Perl 標準で
\p{InHiragana}
という文字クラスが定義されており、
これを正規表現中で使うと、平仮名1文字と一致します。
[2]
この文字クラスは Perl スクリプト内で自由に定義できます。
これを利用した文字クラス定義群が、この
Char::Class
モジュール群です。
[3] CharClass — A Perl Regular Expression Character Class Library https://suika.suikawiki.org/www/charclass/readme
[4] ライセンスはperlと同じライセンスを採用しています。
[5] 開発に参加したい方は mailto:wakaba@suikawiki.org までご連絡下さい。また、ご意見などはこの Wiki page 内 (>>6 とか) に書いて下さい。
[7] モジュールは編集が容易なように、直接使用できる Perl module 形式ではなく、ある程度形式化された Perl script で CVS repository には入っています。 (*-src.upl という名前になっています。)
モジュールの生成のための共通項は mkpm.pl https://suika.suikawiki.org/gate/cvs/perl/lib/Char/InSet/mkpm.pl として独立させてあります。 (mkpm.pl 単体では動作しません。) (ちょっと命名が悪かったという気はしています。)
モジュールを生成するには、
$ perl foo-src.upl > foo.pm
とします。 make が使えるなら、 make foo.pm でも OK です。 全部一気に作るときは make all とします。
[8] 各 source script の書き方は、既存のものを眺めてみればわかると思います。文字を直接書く方法, perl が分かる形で書く方法, ISO/IEC 10646-* 附属書A の表のような形式で書く方法が用意されています。 (モジュールに変換する時にどの形式も perl が分かる形に変換されます。)
NameChar
の文字級Kana-src.upl は特殊で、これら3つのモジュール共通の source script です。実行時の引数により出力が変化します。
UCS の組 (collection) です。 ISO/IEC10646-* 附属書A で定義されています。 Perl には Unicode に基づく block ごとの定義が入っていますが、これはかならずしも ISO/IEC 10646 と一致しません。
Char::InSet
から Char::Class に名前を変えました。\p{}
を使うと、 lib/unicore/utf8_heavy.pl
が呼び出されるようです。級 InFoo は、 perl 組込み (実体は lib/unicore/*/*.pl
) 以外である場合、 caller(1) . '::InFoo'
という名前の関数を探します。この caller の返す値が (多分その値を初めて使うときにだけ) 呼び出し経路かなんかの関係か何か(謎)で本来の場所ではなく、 unicore 系のライブラリ (package 指定無しなので main。) になっているみたいです。そのため main::InFoo
が呼ばれてエラーになります。main
にも輸出する手抜きコードを加えました。\p{}
の個数が不定な時、例えば \p{InFoo}+ だと全然一致しません。個数がはっきりしている時 (\p{InFoo}{2} とか) は問題ありません。これは perl の不具合のような気がしますが、ちゃんと追いかけてません。これは現時点では対策はありません。