<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> 5.8 以降では、 <code class="perl"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">\p</anchor>{In<var>FooSet</var>}</code> や 
<code class="perl"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">\P</anchor>{In<var>FooSet</var>}</code>
という<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>が<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規表現</anchor>で使えます。例えば、 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> 標準で
<code class="perl"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">\p</anchor>{InHiragana}</code> という<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>が定義されており、
これを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">正規表現</anchor>中で使うと、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">平仮名</anchor>1文字と<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">一致</anchor>します。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end>
この<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>は <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Perl</anchor> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">スクリプト</anchor>内で自由に定義できます。
これを利用した<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">文字クラス</anchor>定義群が、この
<code class="perl" xml:lang="en"><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Char::Class</anchor></code> モジュール群です。</p><section><h1>配布・開発</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> 
<cite xml:lang="en">CharClass — A Perl Regular Expression Character Class Library</cite> 
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://suika.suikawiki.org/www/charclass/readme">https://suika.suikawiki.org/www/charclass/readme</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> ライセンスは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">perlと同じライセンス</anchor>を採用しています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> 開発に参加したい方は <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="mailto:wakaba@suikawiki.org">mailto:wakaba@suikawiki.org</anchor-external>
までご連絡下さい。また、ご意見などはこの Wiki page
内 (<anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;6</anchor-internal> とか) に書いて下さい。</p></section><section><h1>モジュールの生成</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> モジュールは編集が容易なように、直接使用できる Perl module
形式ではなく、ある程度形式化された Perl script で CVS repository
には入っています。 (*-src.upl という名前になっています。)</p><p>モジュールの生成のための共通項は mkpm.pl 
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://suika.suikawiki.org/gate/cvs/perl/lib/Char/InSet/mkpm.pl">https://suika.suikawiki.org/gate/cvs/perl/lib/Char/InSet/mkpm.pl</anchor-external>
として独立させてあります。 (mkpm.pl 単体では動作しません。)
(ちょっと命名が悪かったという気はしています。)</p><p>モジュールを生成するには、</p><pre> $ perl foo-src.upl &gt; foo.pm</pre><p>とします。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">make</anchor> が使えるなら、 make foo.pm でも OK です。
全部一気に作るときは make all とします。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> 各 source script の書き方は、既存のものを眺めてみればわかると思います。文字を直接書く方法,
perl が分かる形で書く方法, ISO/IEC 10646-* 附属書A
の表のような形式で書く方法が用意されています。
(モジュールに変換する時にどの形式も perl が分かる形に変換されます。)</p></section><section><h1>現在あるモジュール一覧</h1><ul><li>Char::InSet::Alphabet —— アルファベット (主に欧米言語用文字)</li><li>Char::InSet::Han —— 漢字</li><li>Char::InSet::Hiragana —— 平仮名</li><li>Char::InSet::ISOIECTR10176 —— ISO/IEC TR 16176 (プログラム言語識別子の推奨文字集合)</li><li>Char::InSet::JISX0221 —— <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JISX0221</anchor> 附属書1 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UCS</anchor> 日本語レパートリ)</li><li>Char::InSet::JISX4051 —— <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JISX4051</anchor> (日本語行組版) 文字クラス (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UCS</anchor> の場合)</li><li>Char::InSet::JISX4052 —— <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">JISX4052</anchor> (日本語組版交換形式) 文字クラス</li><li>Char::InSet::Kana —— 仮名</li><li>Char::InSet::Katakana —— 片仮名</li><li>Char::InSet::RFC1815 —— RFC 1815 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UCS</anchor> 日本語部分集合)</li><li>Char::InSet::UCS —— <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UCS</anchor> の組 (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO/IEC10646</anchor> 附属書A)</li><li>Char::Class::XML —− <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">XML</anchor> の構文、例えば <code class="XML">NameChar</code> の文字級</li></ul></section><section><h1>Char::InSet::Han</h1><p>現在、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">常用漢字表</anchor>の文字や<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">人名用漢字表</anchor>の文字、
学年ごとの教育漢字などの集合を含んでいます。</p></section><section><h1>Char::InSet::Kana, Char::InSet::Katakana, Char::InSet::Hiragana</h1><p>Kana-src.upl は特殊で、これら3つのモジュール共通の
source script です。実行時の引数により出力が変化します。</p></section><section><h1>Char::InSet::UCS</h1><p><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">UCS</anchor> の組 (collection) です。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ISO/IEC10646</anchor>-* 附属書A
で定義されています。 Perl には <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Unicode</anchor> に基づく
block ごとの定義が入っていますが、これはかならずしも
ISO/IEC 10646 と一致しません。</p></section><section><h1>メモ</h1><ul><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> なにかご意見などがありましたら、ここに書いて下さい。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> <weak xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">2003-04-25 19:48</weak> <em><anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">名無しさん</anchor></em>: <code class="perl">Char::InSet</code> から <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Char::Class</anchor> に名前を変えました。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> perl 5.8.0 を使っていますが、幾つか不可解な点があります。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> - ちゃんと <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">use</anchor> しているのに、文字級<var>なんたら</var>は定義されていません、というエラーで死ぬことがあります。しかも同じ場所からの呼び出しで成功したり失敗したりします。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> - <code class="perl">\p{}</code> を使うと、 <code class="file">lib/unicore/utf8_heavy.pl</code> が呼び出されるようです。級 <samp class="perl">InFoo</samp> は、 perl 組込み (実体は <code class="file">lib/unicore/*/*.pl</code>) 以外である場合、 <code class="perl">caller(1) . '::InFoo'</code> という名前の関数を探します。この <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">caller</anchor> の返す値が (多分その値を初めて使うときにだけ) 呼び出し経路かなんかの関係か何か(謎)で本来の場所ではなく、 unicore 系のライブラリ (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">package</anchor> 指定無しなので <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">main</anchor>。) になっているみたいです。そのため <code class="perl">main::InFoo</code> が呼ばれてエラーになります。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> - <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;11</anchor-internal>-12 とりあえず <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Exporter</anchor> で <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">use</anchor> 元モジュールに輸出するほかに、 <code class="perl">main</code> にも輸出する手抜きコードを加えました。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> - もう一つの問題は、 <code class="perl">\p{}</code> の個数が不定な時、例えば <samp class="perl">\p{InFoo}+</samp> だと全然一致しません。個数がはっきりしている時 (<samp class="perl">\p{InFoo}{2}</samp> とか) は問題ありません。これは perl の不具合のような気がしますが、ちゃんと追いかけてません。これは現時点では対策はありません。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;15</anchor-internal> これは perl 標準の特性でも発生した問題です。 <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ActivePerl</anchor> の build 804 から 806 にしたら直りました。 (本家 perl でもあったのかどうかは試してないのか分かりませんが、少なくても ActivePerl のバグだったみたいです。)</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;14</anchor-internal>-15 本家 perl も 5.8.1 では治っています。</li><li><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> <anchor-internal xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">&gt;&gt;14</anchor-internal>-16 正しく動くかどうかは <kbd>make test</kbd> で検査することにしました。</li></ul></section></body></html>