/
737.txt
88 lines (68 loc) · 5.93 KB
/
737.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
[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]] で検査することにしました。