情報科学概論
2000.6.13


  1. 本日の作業内容

  2. 正規表現オブジェクト

    表2-9に正規表現の結果を表す変数が列挙してあるが、本日の作業ではそれらを利用するものが多いので、一通り目を通しておくこと。正規表現と文字列との比較を行い、マッチした部分やマッチした部分から後、というような値を参照するのに使われれる。

    表の下の例では、$~の例が挙げてある。少し変更した例を示す。

    例
    #!/usr/bin/ruby
    #var.rb
    
    /^ab.*c/ =~ "abc"
    save = $~
    /^def/ =~ "define"
    print "$~ = ", $~, "\n"
    $~ = save
    print "$~ = ", $&, "\n"
    

    ここでは、マッチした部分をsaveという変数に代入し、別のマッチを行った後、再びsaveから読み込んで値を戻すという作業を行っている。

    p.80の例は上側のスクリプトでマッチ発生以前に式展開(p.68)によりマッチ結果を$1および$2に置換しようとしているので、置換するべき文字列が存在せず、

    print "abcd".sub("(abc)(.)", "#{$2}#{$1}")

    としても空行が結果として戻るエラーが発生する。(sub(p.71)のかっこの中をまず実行してからsubの目的である置き換えを行うので、"abcd"を操作するよりも前には$1などは決まっていない。)下側では、上の問題を回避するために、後方参照(p.73)が用いられている。printを補って確認して見よ。


  3. 文字列処理

    この節では自分が操作しているワークステーションがメールサーバ機能をもっているというUNIX的な環境を想定して説明が行われている。UNIXワークステーションでは、メールの送受信を担当するSMTPサーバ機能が各ワークステーションに存在し、そこでメールの読み書きと送信の両方を行うことが行われている。そのときには、例えば、Linuxであれば教科書とは異なり、

    /var/spool/mail/ユーザアカウント名

    というディレクトリにいったんメールが蓄えられ、自分でメールを読んだ後には自分のホームディレクトリにあるmboxというファイルなどとして保存されている。それを想定してスクリプトが紹介されているので、教室の環境では少し動作環境が違う場合がある。また、メールを読んでしまうと、そのディレクトリにはメール本体が無くなるので、実行すべきファイルが無い状態となってしまう。

    /var/spool/mail/自分のアカウント名

    にデータがある場合に限って実行してみればよいが、先週の課題であるlsの出力操作がここでの例題を兼ねるのでそちらで勉強すればよい。なお、openメソッドはp.86で説明されているので、授業ではそのときに改めて紹介する。


  4. 日本語処理

    漢字を扱う日本語では使用する文字数がかなり多くなるので、アルファベットが基本の西欧言語のように1バイトで文字を表現することができない。そこで、2バイトを一文字として文字のコードを指定する方式が使われているが、パソコンメーカやワークステーション環境などそれぞれの発達時期とのかねあいで複数の文字コードが利用されている。パソコンでは通常はシフトJISと呼ばれる文字コードが利用されており、最近ではユニコードの利用も始まっている。UNIXではEUCという文字コードが以前より使われていた。また、ネットワークを利用する場合、途中の中継に関して8ビット目を別の目的で使う経路などが存在した歴史的な経緯から7ビットで文字コードを表現できるJISコードが基本である。

    2バイトを一文字として扱うためにはある種の「宣言」を行って、ここからは2バイトごとに文字を区切る、というような作業が必要となる。その方式については詳しく述べる時間がないので別の機会に譲るが、ここで重要なのはRubyではEUCとシフトJISを利用することである。

    漢字や日本語文字列がEUCにおいてどのようなコードとなっているかは、 このページで調べることができる。
    p.84におけるjcodeモジュールの扱いでもその文字コードが影響してくる。そのことを試すことにするが、その際に、新たにKtermをもう一つ立ち上げそこで作業することを推奨する。やってみるとわかるが、JISコードを利用すると、画面表示が乱れて復帰できなくなるからである。

    例
    #!/usr/bin/ruby
    #jcode.rb
    
    require 'jcode'
    print "abcdef".tr("a-z", "A-Z"), "\n"
    

    上のスクリプトの意味は、abcdefという文字列に対して、アルファベットの小文字を日本語2バイト文字のアルファベットの大文字に置換して出力する命令である。ここで、置換する文字列はかんなを起動して日本語入力モードとし、例えば、AとキータイプしてC-nにより2バイト文字とする必要がある。

    さて、上記スクリプトをXEmacsで作成し、Kterm上で実行すると、Aを表示した後、意味不明の漢字の羅列となって入力や操作ができなくなる。この状態ではKtermをクローズボタンにより強制的に終了させるしかない。これは、XEmacsが電子メールをやり取りするためにJISコードを使っているためである。教科書にあるようにEUCもしくはシフトJISで無いと上手く動かないので変換してから再び作業を行う。

    $ nkf -e jcode.rb > ecode.rb

    として、文字コードをEUCとした新たなファイルであるecode.rbを作成する。ここで、nkfはNihongo Kanji code converting Filterであり、オプションとしてeがEUCに、jがJISに、そして、sがシフトJISに文字コードを変換するツールである。文字コードをEUCに変更した後にもう一度スクリプトを実行してみるとどうなるか、各自で確認すること。

    最後にp.85の文字コードに関するモジュールであるKconvではコードの変換などが行えるが、説明のわかりにくいところもあるので補足しておく。

    Kconv::guess(str)によりstrの文字列の文字コードを推定して定数を返す、とあるが、ここで帰ってくる値は整数であり、表の下段のKconv::AUTOからKconv::UNKOWNまでそれぞれ0, 1, 2, 3, 4, 4, 0と対応している。例を示すと、

    例
    #!/usr/bin/ruby
    #conv.rb
    
    require 'kconv'
    print Kconv.guess("abcde"), "\n"
    print Kconv.guess("ABCDE"), "\n"
    

    では、結果は0,1となる。また、そのスクリプトファイルをnkfによりシフトJISやEUCに変換すると結果がどうなるが、確認して見よ。

    文字コードを変換したスクリプトをXEmacsで開たとき、画面下部のモード行の表示が変わっていることに注意すること。ISO7とはJISコードを表し、Ja/EUCおよびJa/SJISはそれぞれEUCとシフトJISのファイルであることを表示している。

  5. 課題

    授業の進み具合によって課題を課すのでアナウンスに注意すること。


ページの先頭に戻る

目次ページに戻る