情報科学概論
2001.7.3



  1. 本日の作業内容

    1. バージョンアップについて
    2. 文字列リテラル
    3. コマンド出力
    4. インデックス式
    5. 演算子
    6. 正規表現による操作
      1. 文字列による置換
      2. 文字列のフィールド分割
    7. 行末処理
    8. 文字列から数値への変換
    9. 変数と定数
    10. 出力(印字)
    11. 本日の実習内容
    12. 宿題
    13. 次週の予定


  2. バージョンアップについて

    諸々の事情により教室のRubyを1.4系から1.6系へとバージョンアップした。 それに伴い、いくつかのバグも修正されているので、以前に問題になった本来 なら現れるはずの parseエラーが出ない状況なども改善されている。少し古いスクリプトを 動かすときなどには注意すること。

  3. 文字列リテラル

    教科書p.84

    教科書p.85にあるバックスラッシュ記法は既にいくつかを使用して来た。ここで、 改めてどんなものがあるのかを確認しておくこと。また、は¥記号として表 示される端末環境もあるので、注意すること。(厳密には異なるコードの文字で あるが、種々の理由により日本語環境では混同されている。)

    p.85の#{…}についてのスクリプト例はグローバル変数を用いたものが使用されているが、同様のこ とを通常の変数で実行するには、例えば以下のようなスクリプトとすれば良い。

    ell = "ell"
    ello = "allo"
    puts "H#{ello}!"
    puts "H#{ell}o!"

    結果は自分で確認すること。

    次に紹介されているのは、文字列の引用符としてのダブルクオートとシングルクオー トの違いである。以下の例を実行してみてその違いを考えてみよう。また、文字列 としての扱われるか、数値として認識されるかの違いが引用符によることも確認しよう。

    el = "ello"
    print "H#{el}!\n"
    print 'H#{el}!\n'
    
    puts "2+3"
    puts '2+3'
    puts 2+3

  4. コマンド出力

    教科書p.86

    スクリプトの実行結果は通常は画面に表示される。これを自分が実行したいコマン ドとして出力するためには、教科書にあるように(バッククオート )の記号を使用する。この記号は キーボード上では@と同じキーに割り当てられており、シフト操作により入力 する。最も簡単な例を以下に示す。

    puts 'date'
    puts `date`

    引用符による動作の違いが理解できただろうか。引数などを与えるために複数の文 字列からなるコマンドを実行させるには、例えば以下のようにする。

    command = "cal 1 2001"
    puts `#{command}`

    また、コマンド出力を利用すると、以下 のようなファイル名の一括変換のスクリプトが作成できる。これは、あるディレク トリ内で拡張子が .txt というファイルを全て拡張子 .html に変更するスクリプト である。

    #!/usr/bin/ruby
    
    line = `ls`.chomp!
    
    name = line.split("\n")
    for i in 0..name.size
      if name[i] =~ /\.txt$/
        command = "mv " + name[i] + " " + name[i].gsub(/\.txt/, ".html") +  "\n"
        print `#{command}`
      end
      
    end

    スクリプトを ext.rb という名前で保存し、

    $ chmod +x ext.rb

    として実行権限を与えると、ファイル名を変更したいディレクトリにそのスクリプ トを置けば、

    $ ./ext.rb

    により、指定の条件にしたがってファイル名を変更する。動作を簡単に説明する と、最初にコマンド出力として ls によりファイル名の一覧を得る。次に改行文字を 削除し、 ls による出力の行数分ループを回す。ループの中の処理 は正規表現に関するもので、 .txt で終るファイル名があればその部分を .html に変更するコマンド文字列を 一度生成し (変数 command)、それをバッククオートによるコマンド出力の中身としている。

  5. インデックス式

    教科書p.89

    文字列や数値などが順に対応付けされているものを配列と呼ぶが、ここにあるイン デックス式は一見配列のように見えるが、文字列に対するものであることに注意が 必要である。すなわち、文字列の中の何番目の文字かを指定するのにインデックス 式が使用される。そこで使用される示数(インデックス)には負の数が使用できるの でそれにも注意が必要である。例えば、p.89の一番下にある例は、abcde という文 字列の右から3番目から一番右側まで、と言う指定になっている。

  6. 演算子

    教科書p.90

    数値計算を行う際に算術演算子という記号を普通の数学的な用法で使用して来た。 例外はが代入に当てられていることであったが、ここで学習する文字列について も算術演算子である記号が使用できる。は文字列に対して使用されると、文字 列の連結を表す。また、* 記号が繰り返しとして使用できる。以下に動 作確認のための例を示す。

    p "2" + "3"
    p "1" + "5"
    p 2 + 3
    p "2" * 3

    フォーマット出力として%を使用する方法についてもp.91に説明があるが、その用 法自体よりも表にある表現方法の方を良く覚えておくこと。これらはC言語の使用 法を元にしているので、他の言語を使用する際にも役に立つ。以前に課題で実習し たが、理数系における有効数字の使用は、厳密に桁数を指定する場合には指数表現 を使用するので、%e が必要になる場合がある。また、%f で注意するのは、整数部の 桁数であり、そこで指定した桁数は「最低」の物であり、それ以上になりうること を理解しておこう。すなわち、%1.1f で指定した変数や定数の値が10になったとす ると結果として出力されるのは、10.0になるのである。

  7. 正規表現による操作

    教科書p.93

    正規表現は文字列を厳密に扱いたいときに必要になる表現であり、種々の場面で使 用されている。例えば、行頭、行末、カンマやスペースで区切られた文字列の特定 の部分など、その文字列の並びから必要な情報を抽出して表現するのが正規表現で ある。ここでは、あまり詳しく紹介されていないので、p.224からの表を参照する ことが望ましい。

    1. 文字列の置換

      教科書p.93

      操作を必要とする文字列は行単位で読み込むことが多いので、その行に対して置換 を行う場合には gsub による場合が多い。前述のファイル名変更スクリプトでも使用 しているように、文字列中のある部分を別の文字列に置換するメソッドである。 gsub の括弧の中は、第一引数は正規表現によりマッチする部分を表現し、それを置き換える文字 列をカンマの後に記述してある。

    2. 文字列のフィールド分割

      教科書p.95

      行単位で読み込んだ文字列から情報を取り出すためには、必要な部分を切り出す必 要がある。文字列がスペースやカンマなどで区切られている場合には、それらを区 切り記号(セパレータ)として配列として扱うことが可能である。そのように、セパ レータを指定して文字列を配列に変更するメソッドがsplitである。

      表のように縦にそろえて並んでいる文字列の場合には、タブや複数のスペースで体 裁が整えられている場合があるので、スペースの任意回数の繰り返し、などの条件 を指定する必要がある。

  8. 行末処理

    教科書p.97

    行ごとに処理をする場合に、行の終りには改行文字が付加されていることに注意し ないといけない。改行文字は目には見えないが、一つの文字として扱われるので、 例えば、前述のファイル名変換スクリプトであれば、行末の .txt をマッチさせよう としても改行文字のためにマッチしないことになる。そこで、その改行文字を削除 しておく必要があるが、それを行うメソッドが chop もしくは chomp である。

    教科書にあるように、chopは改行文字を削除するが、chompの方は特定の条件にし たがった文字列を削除する。デフォルトではグローバル変数 $/ が指定されているが、 そのグローバル変数の中身を知るために、

    p $/

    として見ると良い。任意の文字を削除するには chomp の引数として指定する。

  9. 文字列から数値への変換

    教科書p.99

    この変換メソッドも今までの宿題で利用して来た。使い方は分かると思う。文字列 として認識された数値を計算可能な数値に変換するためのメソッドであり、必要に 応じて8進数や16進数表記も使用される。

  10. 変数と定数

    文字列や数値をプログラムの中で扱う際に、それを何らかの入れ物に入れて名前を つけておく必要がある。そのために使用するのが変数と定数であるが、扱い方とし ては数学で使う変数や定数と似ている。すなわち、変数は変化する値を入れるもの であり、何度でも違う値(数値や文字列)を代入することができる。一方、定数は一 定の値を持つので、一度代入を行うとその値以外に変更できない。

    a = 1
    puts a
    a = 2
    puts a
    
    A = 1
    puts A
    A = 2
    puts A

    上のスクリプトがエラーになることを確認せよ。

    スコープの範囲の制約があるので、スクリプト中で一時的に変更する ことは可能である。
    変数にはいろいろな種類があるが、基本的には小文字で始まる名前をつける。定数 は大文字で始まるのが特徴である。また、ARGV ARGF のようにあらかじめ役割が決 まっている定数がある。ここで、変数や定数といっても配列にすることもできる。

  11. 出力(印字)

    プログラムの最終的な役割は結果の表示である。現在のレベルでは「標準出力」と 呼ばれる画面に表示することのみを想定しており、そのためのメソッドをいく つか学習した。ここで、代表的な4つのメソッドについて復習しておく。

    • puts

      puts は最も単純な出力であり、一度に一つの値を改行付きで出力する。

    • print

      通常の出力方式であり、行末に自分で改行文字を入れる必要がある。複数の値をカ ンマで区切って1行に出力することができる。

    • printf

      フォーマット付き出力であり、前述の%記号によるフォーマットにより表示の文字 数などを制御する。下の例のように文字列の中に % 記号で出力する値を埋め込 む形で使用する。

      a = 2.0
      b = 3
      printf ("a (= %f) x b (= %d) = %f", a, b, a*b)

    • p

      上の3つが値の出力であったのに対し、pはオブジェクトの中身を表示する。配列で あれば配列の形式、数値や文字もそのものの持つ意味と併せて表示する感覚である。

    上記の4つのメソッドの振舞を見るには以下のような表示をさせてみると良い。

    puts "abc"
    print "abc"
    p "abc"
    
    puts 2+3
    puts "\n"
    print 2+3
    print "\n"
    p 2+3
    p "\n"
    
    a = 3
    b = 4
    puts a, b, a*b
    
    print a, b, a*b, "\n"

  12. 本日の実習

    作業1
    教科書のスクリプト例を自分で試してみること。

    作業2
    webテキストに紹介した例も試してみること。

  13. 宿題

    授業の終わり頃に次回までに提出する課題を発表するのでアナウンスに注意すること。また、発表されたら課題を表示するためには、一度このページを再読み込みする必要があるのでNetscapeのボタンをクリックする。そうしないと、課題のページは表示されない。

  14. 次週の予定

    来週は、配列に関する節に進む。また、復習としては正規表現について実習する。 なお、教科書に従い内容を実習するのは次回が最後である。17日は試験期間にあた るが、この講義は通常の筆記試験は行わない。その代わり、17日は課題を仕上げ るための実習時間に当てる。来週以降、課題の提出状況ページに暫定的な成績評価もあ わせて表示するので、評価を上げたい場合には17日は必ず出席のこと。最終的な課題の提出締切は7月27日(金)の予定である。


トップに戻る

目次ページに戻る