[Enter] キーを押すことを意味します。
| a | [A] キーを打つ |
| C-x | [Ctrl] キーを押しながら [X] キーを打つ |
| C-x C-f | [Ctrl] キーを押しながら [X] キーを打ち、さらに [Ctrl] キーを押しながら [F] キーを打つ。 |
| C-x k | [Ctrl] キーを押しながら [X] キーを打ち、さらに [Ctrl] キーを離した状態で [K] キーを打つ。 |
| M-x | [Alt] キーを押しながら [X] キーを打つ。 |
| F12 | [F12] キーを打つ。 |
STEP 3 では、PDIC 辞書ファイルから一定の条件を満たす項目だけを抜き出して、Unicode 形式のプレーンテキストファイルまたは XML ファイルに保存する方法を説明します。
抜き出す項目の条件を記述するために、ごく簡単なプログラミングをする必要があります。そのため、まず xyzzy という奇妙な名前のテキストエディタについて説明します。期限なしで無料で使えるこのソフトウェアは Unicode 形式のファイルを扱える上に、Perl スクリプト * を直接実行できるので便利です。これ以外にも優れたテキストエディタは存在しますが、今後はこのソフトウェアの使用を前提に説明を続けます。
xyzzy はインプレス社「窓の杜」の xyzzy からダウンロードできます。xyzzy には特別なインストーラーはありません。Lzh 形式の圧縮ファイルを適当なフォルダ(例えば、C:¥Program Files)に解凍するだけです。
[スタート] ボタンから xyzzy を実行できるようにする手順は、次の通りです。
xyzzycli.exe を選んで [OK] ボタンを押す。環境変数 XYZZYHOME に、xyzzy で書く文書やスクリプトを保存するフォルダを指定します。例として C:¥home を指定する手順を次に示します。
C:¥AUTOEXEC.BAT をメモ帳で開く。C:¥AUTOEXEC.BAT を保存する。.xyzzy の作成.xyzzy はキー配列などを設定するためのファイルです。おそらく標準のキー配列のままでは Windows ユーザーには使いにくいので、とりあえず私が作った .xyzzy をダウンロードして使ってみることをお勧めします。.xyzzy の上で右クリックして [対象をファイルに保存] を選び、C:¥home に保存してください。
xyzzy で表示・編集するテキストの一つ一つはバッファと呼ばれる仮想的な入れ物に収められています。

上図の A の部分にバッファの一覧が表示されています。バッファの名前の書かれたタブをクリックすることで、バッファの内容を B の領域に表示し、編集することができます。この領域をウィンドウと呼びます。
モード行と呼ばれる C の領域にはバッファの名前や状態などが表示されます。一番左の ----- はバッファの変更状態を示すもので、バッファの内容が変更されておりファイルに保存されていないとき、--**- になり、バッファの内容を変更できないとき --%%- になります。その少し右にある [utf8:crlf] という部分は、コロン(:)の左側が文字コード、右側が改行コードを示します。この例では、文字コードは UTF-8 で、改行コードは CR + LF です。
sjis、euc-jp、win-greek など他にも多数あります。改行コードは CR + LF(Windows 式)、 LF(Unix 式)、 CR(Macintosh 式) のいずれかです。
D の部分はエコー領域と呼ばれ、ユーザーにメッセージを表示するために、あるいは編集コマンドに関連してユーザーに文字を入力させるために使用されます。ミニバッファと呼ばれることもあります。
| キー | 機能 | 備考 |
|---|---|---|
| C-n | 新規作成 | |
| C-o | 開く | ダイアローグボックスが開く |
| C-s | 上書き保存 | ファイル名がない時はダイアローグボックスが開く |
| F12 | 名前を変えて保存 | ダイアローグボックスが開く |
Unicode (UTF-8) を選んでから開いてください。C:¥home¥pdic¥sample.xml)を開くことができます。
準備作業(2)で私の .xyzzy をホームディレクトリに保存した場合、編集操作は Microsoft Word や「メモ帳」とあまり違いません。マウスで切り抜きや貼り付けをしたい人は、メニューの [表示]-[ツールバー]-[標準] を選んでください。
| キー | 機能 | 備考 |
|---|---|---|
| 矢印 | カーソル移動 | |
| S-矢印 | 選択しながらカーソル移動 | |
| C-x | 選択範囲を切り抜き | 範囲が選択されていない時は、複合コマンドの1つ目。 |
| C-c | 選択範囲をコピー | 範囲が選択されていない時は、複合コマンドの1つ目。 |
| C-v | 貼り付け | |
| C-z | やり直し | |
| C-y | リドゥ | やり直しのやり直し |
| C-a | すべてを選択 | |
| Home | 行の先頭にカーソル移動 | |
| End | 行の末尾にカーソル移動 | |
| S-Home | 行の先頭まで選択 | |
| S-End | 行の末尾まで選択 | |
| PageUp | 前ページへ移動 | |
| PageDown | 次ページへ移動 |
| キー | 機能 | 備考 |
|---|---|---|
| C-f | 検索 | ダイアローグボックスが開く |
| C-r | 置換 | ダイアローグボックスが開く |
| F3 | 下に向かって次を検索 | |
| S-F3 | 上に向かって次を検索 |
| キー | 機能 | 備考 |
|---|---|---|
| C-x & | 外部プログラム実行 | Perl スクリプトの実行はこれで行う |
| C-g | コマンドの中断 | 誤操作により開始したコマンドを中断する |
Step 2 までに出てきたツール群を次表にまとめます。
| 名称 | 引数 1 | 引数 2 | 機能 |
|---|---|---|---|
| pdic2txt | foo.dic | foo.txt | PDIC辞書ファイル ⇒ テキストファイル(Shift JIS) |
| txt2pdic | foo.txt | foo.dic | テキストファイル(Shift JIS) ⇒ PDIC辞書ファイル |
| pdic_utf8 | foo.dic | foo.txt | PDIC辞書ファイル ⇒ テキストファイル(Unicode/UTF-8) |
| utf8_pdic | foo.txt | foo.dic | テキストファイル(Unicode/UTF-8) ⇒ PDIC辞書ファイル |
| pdic_xml | foo.dic | foo.xml | PDIC辞書ファイル ⇒ XML 文書 |
| xml_pdic | foo.xml | foo.dic | XML 文書 ⇒ PDIC辞書ファイル |
PDIC Toolkit Ver. 1.13 より、引数として指定するファイルの拡張子を省略できるようになりました。また、引数 2 のファイルの本体が引数 1 のそれと同じである場合は、引数 2 自体を省略できます。つまり、次の 2 つのコマンドの意味は同じです。
PDIC Toolkit Ver. 1.13 のもう1つの、より重要な進歩は、フィルターを指定できるようになったことです。フィルターの例として Toolkit に verb.pl が付属しています。これは、用例欄(希日辞典プロジェクトでは、ここに品詞の略称を書くことになっています)が“ρ.”で始まる項目(つまり、動詞)だけを抜き出すためのものです。
pdic2txt と txt2pdic はフィルター機能に対応していません。
フィルターを指定するには次のようにコマンドを入力します。
xyzzy を起動し、C-u C-x C-f で verb.pl を開くと、次のようなスクリプトが表示されます。
verb.pl をフィルタとして pdic_xml を実行するには C-x & と入力し、エコー領域に表示される & の右に
と入力します。
すると、ウィンドウが上下2つに分かれて、上のウィンドウにスクリプトの実行結果が表示されます。
*Command Output* という名前のバッファに一時的に保持されます。C-x C-n でこのバッファに(仮の)ファイル名を付ければ、複数の実行結果を別々のバッファに保持して比較することができます。
さて、verb.pl の要点は次の部分です。
さらに煎じ詰めれば、次の部分に「動詞だけを抜き出す」という verb.pl の機能のエッセンスが詰まっています。
変数 $entry->{example} には、今検討している項目の用例欄(example)の内容が格納されています。/^ρ\./ は次項で説明する「正規表現」です。演算子 =~ は、その左側の変数に対して正規表現によるマッチングが行われることを示します。
この条件が満たされた場合には、if 節の中括弧ペアの内側、すなわち return 1; が実行されます。この文はサブルーチン filter を呼んだプログラム(pdic_xml など)に 1 という値を返します。条件が満たされなかった場合には、else 節の中括弧ペアの内側、すなわち return 0; が実行されます。つまり、プログラム本体側は 0 という値を受け取るわけです。
pdic_xml などのプログラムは、サブルーチン filter が 1 を返した場合にのみ項目をファイルに出力します。フィルター機能はこういう仕組みでできているのです。
$entry->{example} の部分は、次のリストのうちの1つで置き換えることができます。
| 表現 | フィールド |
|---|---|
| $entry->{headword} | 見出し語 |
| $entry->{pronunciation} | 発音 |
| $entry->{definition} | 日本語訳 |
| $entry->{example} | 用例 |
| $entry->{level} | レベル |
| $entry->{marked} | 暗記必須フラグ |
| $entry->{revised} | 修正フラグ |
verb.pl についてもっと詳しく知りたい方は Appendix A をご覧下さい。
正規表現とは、文字列のパターンを特殊記号(メタキャラクター)と文字の組み合わせで表現したものです。例えば、「"c" で始まり "t" で終わる小文字のアルファベットの列」というパターンは次のように表現されます。
この正規表現は、"cat"、"chat"、"cut"、"component" などの様々な英単語にマッチします。この表現の中では ^ [ - ] + $ の6文字がメタキャラクターです。これは他愛のない例に過ぎませんが、Perl の正規表現は極めて強力なので、思いつく限りの様々なパターンを記述することができます。
perlre の項(英語)は網羅的ですが、初心者が読みこなすのは難しいでしょう。とりあえずは、
に目を通すとよいでしょう。Perl(Ver. 5.005)マニュアルを日本語訳した「正規表現(perlre)」もありますが、日本語ならわかりやすいだろうと考えるのは早計です。
先ほどの verb.pl では、次の下線部分が正規表現です。
$entry->{example} =~ /^ρ\./
まず最初のキャレット ^ は「対象となる文字列の先頭」にマッチするメタキャラクターです。次の ρ は普通の文字(ギリシャ文字のロー)です。バックスラッシュ \ は、次に続く文字(列)と組み合わさって様々な意味を持ちますが、ここでは次のドット . を普通の文字に戻す役割を果たしています。本来、ドット . は「改行文字を除く任意の文字1個」にマッチするメタキャラクターです。
要するに、^ρ\. という正規表現は「対象となる文字列の先頭に "ρ." がある場合」というパターンを示す、ということになります。
上の例のように、Perl では正規表現を2つのスラッシュ / で囲んで示します。
/^http:\/\/www\.perl\.org\.\//と書くことになり、目がチカチカしてきます。そこで、Perl では次のようにも書くことができるようになっています。
m#^http://www\.perl\.org/#
m で始まっている限り、英数字および空白文字以外の任意の記号をデリミタとして使用できます。ただし、括弧類 { } ( ) [ ] < > を使う場合は、
m{^http://www\.perl\.org/}
のように、必ず対にして使う必要があります。
正規表現の体系的な説明を始める元気はないので、例を見ながら学んでいただくことにしましょう。
^c[a-z]+t$
[a-z] は文字クラスの一例です。"a" から "z" までの任意の文字1個にマッチします。[aeiuo] のようにハイフンを使わずに文字を並べることもできます。あるいは [0-9a-f] のように2つの範囲を組み合わせることもできます。
[α-ω] や [あ-ん] のような書き方もできます。ただし ά が α より前にあるのに ύ は υ より後ろにあるなど、文字コードの順番というのはなかなか複雑です。任意のギリシャ文字を示す文字クラスは [Ά-ώ] です。また任意のひらがなは [あ-ん] ではなく [ぁ-ん] と表現します。次の + は量指定子の1つで、直前の文字あるいはサブパターン(後述)が1回以上繰り返されることを意味します。[a-z]+ で1個以上の連続する小文字のアルファベットにマッチします。よく似た量指定子に * があります。これは0回以上の繰り返しを示します。i[a-z]+t は "it" にマッチしませんが、i[a-z]*t はマッチします。
最後の $ は、文字列の末尾にマッチするメタキャラクターです。これがないと、"category" など "t" で終わらない文字列にもマッチしてしまいます。
(ου|ιε)μαι$
(A|B) という形の正規表現は "A" または "B" にマッチします。この例は ουμαι または ιεμαι で終わるというパターンの正規表現です。
【法律?】
メタキャラクター ? も量指定子の1つで、0回または1回の繰り返し(変な言い方ですが)を意味します。この例は 【法】 または 【法律】 にマッチします。
verb.pl の if で始まる行を次のように変更し、名前を変えて保存してください。
if ($entry->{level} == 3) {
このフィルターはレベルが 3 の項目だけを抜き出します。== は2つの数値が等しいときに真を返す比較演算子です。レベルが 2 以上の項目を抜き出すなら、条件式を $entry->{level} >= 2 に変えてください。
if ($entry->{definition} eq '') {
eq は 2 つの文字列が等しいときに真を返す比較演算子です。このフィルターは日本語訳が空の項目だけを抜き出します。逆に、日本語訳が空でない項目だけを抜き出すには、条件式を $entry->{definition} ne '' に変えてください。ne は "not equal" の略で、2 つの文字列が等しくないときに真を返す比較演算子です。
if ($entry->{example} =~ /^ρ\./ and $leve->{level} >= 3) {
このフィルターは、用例が "ρ." で始まり、かつ、レベルが 3 以上の項目を抜き出します。and は 2 つの条件式が共に成り立つときに真を返す論理演算子です。
PDIC Toolkit Tutorial - Step 4 では PDIC Toolkit における XML の具体的な利用法を説明します。
黒田努 <tkrd@mail.com> (2002.02.27)