[1] [[Perl]] 5.8 以降では、 [CODE(perl)[[[\p]]{In[VAR[FooSet]]}]] や 
[CODE(perl)[[[\P]]{In[VAR[FooSet]]}]]
という[[文字クラス]]が[[正規表現]]で使えます。例えば、 [[Perl]] 標準で
[CODE(perl)[[[\p]]{InHiragana}]] という[[文字クラス]]が定義されており、
これを[[正規表現]]中で使うと、[[平仮名]]1文字と[[一致]]します。

[2]
この[[文字クラス]]は [[Perl]] [[スクリプト]]内で自由に定義できます。
これを利用した[[文字クラス]]定義群が、この
[CODE(perl)@en[[[Char::Class]]]] モジュール群です。

*配布・開発

[3] 
[CITE@en[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 が分かる形に変換されます。)

*現在あるモジュール一覧
-Char::InSet::Alphabet —— アルファベット (主に欧米言語用文字)
-Char::InSet::Han —— 漢字
-Char::InSet::Hiragana —— 平仮名
-Char::InSet::ISOIECTR10176 —— ISO/IEC TR 16176 (プログラム言語識別子の推奨文字集合)
-Char::InSet::JISX0221 —— [[JISX0221]] 附属書1 ([[UCS]] 日本語レパートリ)
-Char::InSet::JISX4051 —— [[JISX4051]] (日本語行組版) 文字クラス ([[UCS]] の場合)
-Char::InSet::JISX4052 —— [[JISX4052]] (日本語組版交換形式) 文字クラス
-Char::InSet::Kana —— 仮名
-Char::InSet::Katakana —— 片仮名
-Char::InSet::RFC1815 —— RFC 1815 ([[UCS]] 日本語部分集合)
-Char::InSet::UCS —— [[UCS]] の組 ([[ISO/IEC10646]] 附属書A)
-Char::Class::XML —− [[XML]] の構文、例えば [CODE(XML)[NameChar]] の文字級

*Char::InSet::Han

現在、[[常用漢字表]]の文字や[[人名用漢字表]]の文字、
学年ごとの教育漢字などの集合を含んでいます。

*Char::InSet::Kana, Char::InSet::Katakana, Char::InSet::Hiragana

Kana-src.upl は特殊で、これら3つのモジュール共通の
source script です。実行時の引数により出力が変化します。

*Char::InSet::UCS

[[UCS]] の組 (collection) です。 [[ISO/IEC10646]]-* 附属書A
で定義されています。 Perl には [[Unicode]] に基づく
block ごとの定義が入っていますが、これはかならずしも
ISO/IEC 10646 と一致しません。

*メモ
-[6] なにかご意見などがありましたら、ここに書いて下さい。
- [9] [WEAK[2003-04-25 19:48]] ''[[名無しさん]]'': [CODE(perl)[Char::InSet]] から [[Char::Class]] に名前を変えました。
- [10] perl 5.8.0 を使っていますが、幾つか不可解な点があります。
- [11] - ちゃんと [[use]] しているのに、文字級[VAR[なんたら]]は定義されていません、というエラーで死ぬことがあります。しかも同じ場所からの呼び出しで成功したり失敗したりします。
- [12] - [CODE(perl)[\p{}]] を使うと、 [CODE(file)[lib/unicore/utf8_heavy.pl]] が呼び出されるようです。級 [SAMP(perl)[InFoo]] は、 perl 組込み (実体は [CODE(file)[lib/unicore/*/*.pl]]) 以外である場合、 [CODE(perl)[caller(1) . '::InFoo']] という名前の関数を探します。この [[caller]] の返す値が (多分その値を初めて使うときにだけ) 呼び出し経路かなんかの関係か何か(謎)で本来の場所ではなく、 unicore 系のライブラリ ([[package]] 指定無しなので [[main]]。) になっているみたいです。そのため [CODE(perl)[main::InFoo]] が呼ばれてエラーになります。
- [13] - >>11-12 とりあえず [[Exporter]] で [[use]] 元モジュールに輸出するほかに、 [CODE(perl)[main]] にも輸出する手抜きコードを加えました。
- [14] - もう一つの問題は、 [CODE(perl)[\p{}]] の個数が不定な時、例えば [SAMP(perl)[\p{InFoo}+]] だと全然一致しません。個数がはっきりしている時 ([SAMP(perl)[\p{InFoo}{2}]] とか) は問題ありません。これは perl の不具合のような気がしますが、ちゃんと追いかけてません。これは現時点では対策はありません。
- [15] >>15 これは perl 標準の特性でも発生した問題です。 [[ActivePerl]] の build 804 から 806 にしたら直りました。 (本家 perl でもあったのかどうかは試してないのか分かりませんが、少なくても ActivePerl のバグだったみたいです。)
- [16] >>14-15 本家 perl も 5.8.1 では治っています。
- [17] >>14-16 正しく動くかどうかは [KBD[make test]] で検査することにしました。
