第6回(11/6) Rubyの便利なクラス ・ハッシュクラス ・正規表現クラス ・ディレクトリクラス・ファイルクラス ■ ハッシュクラス(Hash) ・http://rubycentral.com/book/ref_c_hash.html (ちなみに、配列クラスは、Array) ・連想記憶ともいう。キーワードで要素を特定する。 ⇒ list0601.rb ■ 正規表現クラス(Regexp) ・http://rubycentral.com/book/ref_c_regexp.html ・生起表現の記号表 ⇒ pattern.tex ・/と/で囲まれた文字列パターンを表す。文字列と照合する。 ・書式: /pattern/[i][o][s|e|u|n][x][m] オプション i .. 大文字小文字を区別しない。o .. 式展開を一度だけ行なう。s .. SJIS と見なす。e .. EUC と見なす。u .. UTF-8 と見なす。n バイト列と見なす。x .. pattern中の空白を無視する。m .. 複数行マッチ、改行も通常文字と見なす。 ⇒ list0602.rb ・正規表現を引数に持つメソッド, gsub, split ⇒ list0603.rb ・例題:標準入力文字列から情報を抽出する。 ⇒ list0604.rb ○準備 http://rubycentral.com/book/tut_stdtypes.html をブラウザで表示 テキスト部分をマウスでカットペーストし、ファイル doc に保存 ○実行 cat doc | ruby list0604.rb あるいは ruby list0604.rb < doc ○結果 place substitute construct indent convert match use get keep ○結果説明 ファイルdoc中にある、"you can 〜"を抽出し、〜部分を表示した。 □□□ 演習1 □□□ リスト list0604.rb では、次の2つ場合、抽出に失敗する: 1. "You can 〜" と大文字で始まる場合 2. 1行に "you can 〜" が 2回以上含まれる場合 これらの不具合を解決せよ。 (合計 15 個のキーワードが得られるはず。) ⇒ prac0601.rb □□□ 演習2 □□□ 演習1の続き。さらに、抽出したキーワードについて、次の単語を収集したい。たとえば、"you can use" から "use" を抽出したが、ファイル doc から "use 〜"を抽出する。 収集結果は、ハッシュインスタンス h に h['use'] = ["the","String#chomp","the","split","a","of","it","of","this","the","parentheses","this","part","back","the","for","the"] というように蓄える。 ※ メインルーチン最後で、p h['use'] とすると結果が表示できる。上述と一致すれば正解。 ヒント1: 文字列から正規表現インスタンスを作るには、Regexp.new(文字列) とする。 http://rubycentral.com/book/ref_c_regexp.html#Regexp.new ヒント2: プログラムのメインルーチンには、 (1) 標準入力からの入力文を配列変数に蓄える部分 (2) 演習1のプログラム((1)で蓄えた内容1つずつについて処理する) (3) キーワードの1つずつについて、 正規表現をつくり、 演習1のプログラム ※ Because の use にマッチしないこと → 正規表現は、文頭または空白があり、キーワードがあり、空白と文字列がある、とする ※ uses や used などの活用形の違いは考慮しなくてよい。use だけでよい。 ⇒ prac0602.rb ■ ディレクトリクラス ・参考:http://rubycentral.com/book/ref_c_dir.html ● 以下はおまじない集:それぞれ、irb 上で試してみよう。 ・カレントディレクトリ(パス)の表示 Dir::pwd ・カレントディレクトリのファイルリストの表示 Dir::foreach(Dir::pwd){|name| puts name} ・ディレクトリの作成 Dir::mkdir('test') ・ディレクトリの移動 Dir::chdir('test') Dir::chdir('..') ・ディレクトリの削除 Dir::rmdir('test') ■ ファイルクラス ・http://rubycentral.com/book/ref_c_file.html ・ファイルのタイプを調べる File::ftype('doc') ・ファイルの情報を得る info = File::lstat('doc') 所有者は info.mode → 8進数で表示するとわかりやすい "%o" % info.mode sprintf("%o",info.mode) ■ 宿題 ■ :プログラムリスト、手書きコメント、実行結果、を提出せよ。 カレントディレクトリのファイルリストを入手し、各ファイルの情報を参照し、そして、最終アクセス時刻 atime の古い順に基づきソートして、最終アクセス時刻とファイル名を表示せよ。 ※ atime は、File::atime(ファイル名) で得られる。 (a) [[アクセス時刻1,ファイル名1],[アクセス時刻2,ファイル名2],…]という配列変数を作り、配列クラスの sort! を利用する。 (b) [アクセス時刻1,アクセス時刻2,…] というアクセス時刻の配列と、[ファイル名1,ファイル名2,…]というファイル名の配列を作る。アクセス時刻を参照しながらバブルソートを行うとき、アクセス時刻の操作と同時にファイル名の操作も行う。 ⇒ work0601.rb, work0602.rb