情報科学概論
2001.5.22
この節でまず知っておくのはUNIX標準コマンドのgrepである。例えば、ホームディレクトリにおいて
$ ls -al
とすると、多くのファイルが属性を含むロング形式で表示される。必要なファイルの情報を見ようとしても探すのに手間がかかる場合も多い。そのようなときに、今年の5月に作成されたファイルを見たい場合、"May"という文字列を含む行だけを表示できれば便利である。grepはそのような目的のフィルタコマンドであり、通常はパイプ処理と組み合わせて、
$ ls -al | grep May
の様に使う。(ただし、Mayという文字列が含まれている行を全て検索するので、例えば、ファイル名がMayであって、ファイルの作成時期が別であっても検索されてしまう。)この節で作ろうとしているスクリプトはそのようなフィルタ動作を行うものであるが、ひらがなで記入してある読み仮名をローマ字入力により検索するという機能を持たせることが工夫されている。内容に関しては教科書を順次読み進めていくこと。
まずは、p.31の上にあるスクリプトの例を試して、日本語を含む文字列について試してみよう。また、自分用のphone.txtというファイルを教科書の例に従って適当に作成し、p.31下側のスクリプトも試してみよう。
教科書p.33
これからしばらくの間行う処理は、文字列の集合であるテキストファイルから、希望の文字列を取り出して、それが含まれる行を表示したり、その行の中の情報を加工して表示することである。文字の集まりの中からある特定の条件を満たしたものだけを取り出す作業を行うために、必要な「ある規則」に従った表現方法として正規表現がある。たとえば、文字列中に「特定の文字列が含まれている」場合、「ある文字で始まる」場合、「ある文字で終わる」場合、「ある文字列が繰り返されている」場合など、条件を満たすものを取り出すために必要な表現方法である。
この節では簡単に紹介されているが、実際には非常に多くの約束ごとがあり、初めから全てを覚えるのは大変なので、必要に応じて使う程度でよい。詳しくは第4章で紹介されている。また、難しい言葉であるが「最左最長一致」という原則がある。これは、以下のような例が考えられる。(p.234)
a[bB]cはabcもしくはaBcという意味であるが、それを"aBcabcd"と言う文字列中で検索させる(これを「マッチさせる」という)場合、
/a[bB]c/ =~ "aBcabcd"
とすると、マッチする部分は"aBc"であって、"abc"ではない。(最左一致)さらに、
English; Mathematics; Physics
という文字列において、English;の部分にマッチさせるために/.*;/という正規表現(「任意の文字の0回以上の繰り返しの後に;がくる」という表現)を作っても、*はなるべく長い繰り返しにあわせようとするので、Mathematics;の部分までマッチすることになり、このような動作を最左最長一致と呼ぶ。
もう一つ注意することは、感覚的に分かりづらいものであるが、0回以上の繰り返し、と言う表現である。a*とはaの次にaが0回以上繰り返されているものにマッチする。つまり、どこかにaがあれば、その次の文字がaでなくても一つだけのaにマッチすることになる。教科書のp.33、34にある表現方法をなるべく多く試して感覚をつかもう。
教科書p.35
入力する値によって変数の値が変化するとき、そのような組み合わせを格納しておく場所があると便利である。すなわち、入力変数が0, 1, 2, 3と変化したときに出力が1, 3, 5, 7のような値を取るときに、array[0] = 1のように表現できると各種の処理を実行するのに助かる。そのような値の組を配列と呼ぶ。例えば、
hoge = ["huga", "hege", "horo"]
とは、名前がhogeという配列の要素は一番目が"huga"、二番目が"hege"、三番目が"horo"と言う文字列であることを表現している。配列の「要素」は順番を表す数値を付けて
puts hoge[1]
のようにすると、hegeが取り出せる。ここで、要素の順番は0が1番目に対応していることに注意しておくこと。また、配列は多重に出来るので、x, yに対するzの値のようなものにも使用できる
b0201 name1 password1
作業1
作業2
abcdeeefg
と言う文字列を
abcdefg
に変換するスクリプト
作業3
のようなxとyの値の表、xy.txtがあるとき、
$ ruby xyz.rb xy.txt
とすると、
z = 2x + 3y
の値を計算して、列表示するスクリプトを検討せよ。
教科書p.30
教科書のp.4にもかかれているようにRubyの得意な分野はテキスト処理と呼ばれる作業である。(テキスト処理の範囲もいろいろとあるが、最近では代表的なものにwebサーバにおけるCGIスクリプトなどがある。)この節では、入門用のスクリプトの例題として、名前を入力すると電話番号や住所が検索できるプログラムの作成を行う。そのために必要な操作を順に学習するが、初めに「正規表現」という重要な概念について勉強し、その後でリスト形式のテキストデータを項目ごとに分類するための「配列」を学習する。
教科書p.33
オブジェクト指向言語においては、オブジェクトの属する「クラス」という考え方が重要である。今までは意識しないで来たが、ここでは改めて少し詳細に見ていく。
教科書p.33
文字列に関しては、以前よりずっと使用してきたオブジェクトであるが、それが属するクラスがStringである。次に示す正規表現において文字列は重要なオブジェクトとなる。
教科書p.37
配列が要素の順番を指定して値を取り扱うのに対して、自分で決めた文字列と要素を対応づけることができるのがハッシュの特徴である。教科書の電話番号検索の例ではハッシュが使用されているように、プログラミングの技術が付いてくると重要なクラスであるが、初めのうちは無理して使わなくても良い。配列で出来ることから始めるのがわかりやすいだろう。
教科書p.38
一つの文字列から特定の区切り記号により複数の文字列を取り出し配列の要素として代入していくメソッドがsplitである。文字通り、文字列を分割する役目がある。区切りは、,(カンマ)の様なものでも良いし、空白文字でも良い。良く行われるのは、
b0201 name2 password2
b0201 name3 password3
のようなリストから左の列の番号、2番目の列の名前、3番目の列のパスワードを順に配列に入れ、その値で教室のユーザ登録を一斉に行う、などのような表形式のデータ、文字列の取り扱いである。5-8の課題であった元号-西暦変換もこのようにsplitを利用して配列を作るとより使いやすいものとなったであろう。
教科書にある、各種スクリプト、正規表現の例などを自分で確認すること。
教科書p.35(詳しくはp.93)にあるgsubメソッドを利用して以下の動作をするスクリプトを検討せよ。
0 1
0 2
0 3
1 0
1 1
1 2
1 3
授業の終わり頃に次回までに提出する課題を発表するのでアナウンスに注意すること。また、発表されたら課題を表示するためには、一度このページを再読み込みする必要があるのでNetscapeのボタンをクリックする。そうしないと、課題のページは表示されない。
目次ページに戻る