情報科学概論
2000.5.30



  1. 本日の作業内容


  2. 課題受け取り状況の公表

    先週より課題の提出状況を授業科目ごとに表にまとめて公表することにしたので、自分の課題が受理されているか心配な場合は確認すること。ただし、状況の更新は原則的に週2回しか行わないので、ページに反映されるのは実際の提出日よりも遅れるのでご了承いただきたい。受け取り状況に疑問のあるときは縄手まで申し出ること。(手段はなるべく電子メールを利用すること)


  3. Ruby入門

    スクリプト言語の主要な用途は教科書にも書いてあるように文字列処理である。どのような場合に用いられるかというと、例えばwebページにおけるCGIスクリプトでアンケートを取ったり、検索を行ったりする場合が挙げられる。また、実験データをコンピュータに取り込むようなときにも、数値の羅列を整理しやすい形に変形して表やグラフを書きやすくするためにも用いられる。

    この節では文字列の操作に関する基本的な事項および非常に重要な概念である「正規表現」について学習する。



    2.14 文字列

    教科書p.68に列挙してある文字列表現の例は自分で実際に出力することにより動作が理解できるので行ってみること。例によって、

    /virtual/home/nawate/script/5-30

    というディレクトリに本日の作業用スクリプトが集められているので適宜コピーして使用すること。

    例
    #!/usr/bin/ruby
    #str.rb
    
    print "Hello World\n"
    print 'Hello World\n'
    print "1+2 = #{1+2}\n"
    print '1+2 = #{1+2}\n'
    print `date`
    print `ls -l`


    このスクリプトにおいて、文字列を特定するための引用符の違いによる式展開などの動作に注目すること。

    また、バックスラッシュ記法については表2-5にまとめてあるが、これも基本的な物だけ知っておけば良い。

    p.69のスクリプト例は、表現方法によっては"(ダブルクオーテーション)が二重になったりすることを防ぐために%を使って表記する例である。適当に変更したスクリプトが用意してあるので、自分で動作を確認してp.69の下側の表の意味をつかんでおくこと。

    #!/usr/bin/ruby
    #percent.rb
    
    print %Q?Hello "World"\n?
    print %~Hello "World"\n~
    print %q[Hello World]
    print %x#date#
    print %wtabc def hijt


    p.70に示してあるヒアドキュメントは自分で任意に決めた文字列で囲んだ範囲をその表現の形のまま取り込む動作となる。いくつかの例に関して試してみること。

    #!/usr/bin/ruby
    #foo.rb
    
    print <<FOO
    this is a test
    FOO
    
    print <<"FOO"
    this is also a test
    FOO
    
    print <<"FOO"
    this is the third test
    print #{10+5}
    FOO
    
    print <<'FOO'
    another test
    print #{10+5}
    FOO
    
    print <<`BAR`
    ls -l
    BAR
    
    print <<"FOO", <<"BAR"
    I said foo.
    FOO
    You said bar.
    BAR
    


    また、p.70の下にあるスクリプトはそのままでは動作しないものなので、もう少し簡単に表現できる例を紹介する。

    #!/usr/bin/ruby
    #indent.rb
    
    def indent
      print <<-FOO
        def foo
          print 'foo'
        end
      FOO
    end
    
    indent



    2.14.1 文字列の機能

    文字列に関するメソッドは表2-6を参照のこと。p.72に例が挙げてある。

    #!/usr/bin/ruby
    #bar.rb
    
    while num = gets()
      num = num.to_i
      printf "%4d: %s\n", num, "+" * num
    end


    ここで、スクリプトの動作を確認するためにはまず読み込むファイルを作成する必要がある。ファイルの内容は、数字が縦に並んでいるだけの形式であり、そのファイルを読み込むことにより数字が示す整数の数だけ+が棒グラフのように並ぶスクリプトとなっている。

    動作は、まず、gets()で読み込んだファイルの一行をnumという変数に代入し、次にそのnumの値を文字列から整数に変更するメソッドであるto_iを用いて数値に直す。棒グラフ表示はprintfが行っており、初めに%4dで整数を4コラム分確保して右寄せして最初に出てくる変数の値を出力する。

    次は%sであるので、文字列として出力するが、その内容は"+" * numで与えられている。"+"の後にカンマが無いので、それでひとくくりの内容であり、中身は、+記号の0回以上繰り返し、繰り返しの回数はnumである。すなわち、+記号をnum回出力する。それにより、棒グラフ的に表現できる。


    2.14.2 パターンマッチ

    ある文書から特定のキーワードを検索し、情報を素早く把握することはよく行われる。その実際の動作に関しては文字列の中に自分が希望する文字列と一致する物があるかどうかの調査である。gooやyahooのような検索サイトでよく使うので知っていることと思うが、そのようなサーチエンジンにおいても効率よく探すことは重要である。そのときに役に立つのが正規表現であるので、大事な概念である。

    p.73の表2-7にどのような文字を使うことによりマッチする文字列を探すかがあるので、参考にしておくこと。

    一文字マッチ、繰り返しマッチ、アンカーについては講義中に説明する。基本的には教科書の記述を読めば理解できるが、いくつか難しい物があるので、説明しておく。

    p.76の下から二つ目のスクリプトの内容は以下のようになる。

    ["'`]のかっこで囲まれた記号は、実は、文字列を出力するときに必ず付ける引用符のどれか一つと一致する物を考慮している。すなわち、"Hello World", とか、'Foo'などのような文字列を考えると、特徴的なのは引用符に挟まれていることである。そこで、例文を見ると、どれか一つの引用符で始まる内容で、その後に続く、任意の0文字以上の繰り返し、その表現の0回以上の繰り返しである。例文中の\1はその前の表現に対して問題がある。


  4. 課題

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


目次ページへ戻る