長いプログラムが書けると達成感が得られるものだが, 実際のところプログラムは短ければ短い程よいものである。 プログラムの記述に慣れたら, すこしでも記述を短くできる記法を覚えていこう。
#{式}
ダブルクォートで括られた文字列中に登場する
#{式}
という書式は,内部の 式
を評価した値に置き換えられる。printf
を持ち出すまでもない軽微なものの出力に便利である。
name = gets.chomp puts "#{name}さんですね?"
変数だけでなく,Rubyの文として通用するどんな式でも書ける。
シングルクォート中の #{ }
はそのままにされる。
`コマンド`
バッククォート ` `
は,内部に書かれた
コマンド をシェル経由で起動し,標準出力から得られた出力を
文字列として取り込む。コマンド一発で簡単に得られる情報を
Rubyプログラムの中で楽に取り込みたいときに用いる。
systemname = `uname -s`
長い文字列をプログラムの中に埋め込むとき,開いたままの
クォートで何行も進む代わりに,ヒアドキュメント の
<< を利用すると見やすいソースとなる。
以下の2つのソースは同じ文字列を printf
で出力する。
#!/usr/bin/env ruby # -*- coding: utf-8 -*- title = "" while title <= "" STDERR.print "タイトルは?: " title = gets.chomp if title > "" then printf("<html> <head><title>%s</title></head> <body> <h1>%s</h1> <p>見本文書です。</p> </body> </html>\n", title, title) end end
#!/usr/bin/env ruby # -*- coding: utf-8 -*- title = "" while title <= "" STDERR.print "タイトルは?: " title = gets.chomp if title > "" then printf(<<_EOS_, title, title) <html> <head><title>%s</title></head> <body> <h1>%s</h1> <p>見本文書です。</p> </body> </html> _EOS_ end end
プログラム中 「<<Word
」
のパターンが現れると,次の行から Word のみが
現れる行までを 「<<Word
」 の
位置にある文字列として処理する。
Word をダブルクォートで括ったときは
置き換え文字列もダブルクォートで括られたように処理されるので
たとえば #{ }
がその式の値に置き換えられる。
また Word をバッククォートで括ったときは
置き換え文字列をコマンドとしてシェルに渡した結果に
置き換える。
ダブルクォートやシングルクォートを含んだ文字列や, スラッシュを含んだ正規表現を作る場合など, %記法を用いると任意の文字で内容物を括ることができる。
記号 | 意味 | 例 | 結果 |
---|---|---|---|
%Q,string, |
" " の文字列 | %Q,foo,
| "foo" |
%q,string, |
' ' の文字列 | %q,#{f},
| '#{f}' |
%x,cmd, |
` ` の文字列 | %x,ls,
| `ls` |
%r,regexp, |
正規表現 | %r,.*/.*,
| /.*\/.*/ |
%w,string, |
文字列の配列(空白区切り) | %w,foo bar,
| ['foo', 'bar'] |
%W,string, |
文字列の配列(空白区切り)#{ }展開,\有効 |
%W,foo #{b},
| ["foo", "#{b}"] |
カンマ(,
)の部分は任意の文字に置き換え可能。
括り始めを開き括弧にした場合は,対応する閉じ括弧を右側に置く。
以下のいずれも同じ意味。
%r,.*/.*, %r|.*/.*| %r(.*/.*) %r[.*/.*] %r{.*/.*} %r<.*/.*>
HTMLのソースを吐き出すときには,出力に " "
を使いたいいっぽう,式展開をするためにダブルクォート括りの
文字列にしたいことが多いので,
title="foo" header=%Q,<body> <h1 class="myclass">>#{title}</h1> </body>,
と %記法を利用するとダブルクォートの記述が楽になる。
複数の単語を配列の初期値として与えるときには
words = %w,foo bar baz hoge hero fuga bochan,
のようにすると,クォート記号を書かなくていいので ソース記述が楽になる。