組込み変数

このマニュアルでは、`$'で始まる変数を「グローバル変数」と呼んでいますが *1 組み込みの変数(これらは特殊な機能と用途を持ちます)の中にはその有効なス コープがグローバルとは限らない場合があります(どこでも使えるという意味で はグローバルですが、その値はグローバルとは限りません)。ここでは、変数の 値のスコープで大別してグローバル変数の一覧を列挙します。

ローカルスコープ

以下の変数はスレッドローカルでもあります。

$_

最後に gets または readline で読み込んだ文字列。 EOF に達した場合には、nil。この変数はローカルスコープです。 (覚え方: Perlと同じ)

$&

現在のスコープで最後に成功した正規表現のパターンマッチでマッチした 文字列。最後のマッチが失敗していた場合には nil。 (覚え方: いくつかのエディタでの & と同じ)

Regexp.last_match[0] と同じ。

$~

現在のスコープで最後に成功したマッチに関する情報(MatchData オブジェクト)。これを設定すると $&$1 ... $9 などの 値が変化します。

このデータから n 番目のマッチ($n)を取り出すためには $~[n] で 参照できます。 (覚え方: ~ はマッチに使われる)

Regexp.last_match と同じ。

$`

現在のスコープで最後に成功した正規表現のパターンマッチでマッチした 部分より前の文字列。最後のマッチが失敗していた場合には nil。 (覚え方: `は文字列の前に置かれる)

Regexp.last_match.pre_match と同じ。

$'

現在のスコープで最後に成功した正規表現のパターンマッチでマッチした 部分より後ろの文字列。最後のマッチが失敗していた場合には nil。 (覚え方: 'は文字列の後ろに置かれる)

Regexp.last_match.post_match と同じ。

$+

現在のスコープで最後に成功した正規表現のパターンマッチでマッチした 中で最後の括弧に対応する部分文字列。 最後のマッチが失敗していた場合には nil。 いくつかある選択型のパターンのどれがマッチしたのか分からない時に便利 (覚え方: be positive and forward looking.)

$1
$2
$3 ...

最後に成功したパターンマッチでn番目の括弧にマッチした値が格 納されます。該当する括弧がなければnilが入ってい ます。(覚え方: \数字 のようなもの)

Regexp.last_match[1], Regexp.last_match[2], ... と同じ。

スレッドローカルスコープ

以下の変数は一つのスレッド内ではグローバルスコープですが、スレッド間で は独立しています。

$?

このスレッドで最後に終了した子プロセスのステータス。 1.6 以前は整数で 1.7 からは Process::Status オブジェクトです。 Process#wait なども参照。

整数値として評価した値は wait() システムコールで得られる値そ のものなので、子プロセスのexit statusを得るには 1/256 します($?/256)。 1.7以降なら Process::Status#exitstatus も使え ます。

$!

最近の例外に関する情報。raise によって設定されま す。

$@

例外が発生した時のバックトレースが配列として格納されます。 配列の各要素はメソッドの呼び出し位置を示す文字列で形式は

"filename:line"

または

"filename:line:in `methodname'"

です。これは caller が返す値と同じ形式です。

$@ へ値を代入するときは、$! が nil であって は行けません。 $@ の参照は、$!.backtrace と同じです。 代入に関しては、 $!.set_backtrace と同じです。

(覚え方: where exception occurred at.)

$SAFE

カレントスレッドのセーフレベル。セーフレベルについては セキュリティモデルを参照してください。

Thread.current.safe_level と同じ。

グローバルスコープ

$=

パターンマッチや文字列の比較でアルファベットの大文字小文字を 区別するかどうかのフラグ。デフォルトはnil。(覚え方: = は比較 に使われる)*2

$/

入力レコードセパレータ。デフォルトは "\n"awk のRS変数のように働きます。

この変数に nil を設定するとファイル全体を一度に読み込みます。 空文字列 "" を設定するとパラグラフモードとみなされ、2つ以上連続した 改行がレコードの区切りになります。

$/には正規表現は使えません。(覚え方: 詩では / を行の区切りに使う)

$\

出力レコードセパレータ。この変数に文字列を指定すると printの度に最後にこの文字列を付加して出力します。 デフォルトはnilでこの場合なにも追加しません。

(覚え方: It's just like /, but it's what you get "back" from Ruby.)

$,

Array#joinのデフォルトの区切り文字列。 printの各引数の間に出力される文字列。

(覚え方: print で , があるところで出力される)

$;

String#split のデフォルトの区切り文字。デフォル トはnilで、この場合特殊な分割を行います。詳細は String#split を参照。

$.

最後に読んだ入力ファイルの行番号。

ARGF.lineno と同じ。各引数ファイル毎の行番号が必要な場合は ARGF.file.lineno を使用します。

$<

引数(なければ標準入力)で構成される仮想ファイル。つまり 定数 ARGF の別名。 (覚え方: <はシェルの入力元指定)

$>
$defout

組込み関数 printputsp などのデフォルトの出力先。初期値は STDOUT-i[extension] オプションを指定した場合には読み 込み元と同じ名前のファイル。 (覚え方: >はシェルの出力先指定)

この変数には、 write という名前のメソッドが定義されたオブジェ クトだけしか代入できません(print 等の組込みのメソッドは、最終的に write メソッドを呼ぶようになっています)。

print 等の Ruby の組込み関数の出力先を変更するにはこの変数の値を別 の IO に再設定すればよいですが、サブプロセスや C による拡張 ライブラリの標準出力までも変更したい場合には IO#reopen や、$stdout によって標 準出力を別の IO にリダイレクトする必要があります。

$0

現在実行中のRubyスクリプトの名前。OSによってはこの変数に代入すると ps(1) の出力が変化します。この機能はプログラムの 現在の状態を表示するのに便利です。(覚え方: sh や kshと同じ)

$*

Rubyスクリプトに与えられた引数。組込み定数 ARGV の別名。Ruby自身に対する引数は取り除かれています。(覚え方: sh や kshと同じ)

$$

現在実行中のRubyプロセスのpid。(覚え方: シェルと同じ)

Process.pid と同じ。

$:

loadrequire がファイルをロードする時に検索するディレクトリのリストを含む 配列。 $LOAD_PATH の別名。 (覚え方: コロンは環境変数PATHの区切り文字である)

起動時には、-I directory オプションで指定したディ レクトリ、環境変数 RUBYLIB の値、デフォルト値(コン パイル時に指定する、多くの場合 "/usr/local/lib/ruby" が基準のディ レクトリになる*3)、"."(カレントディ レクトリ)を値として持ちます。

-I で指定したパス
環境変数 RUBYLIB の値
/usr/local/lib/ruby/site_ruby/VERSION        サイト固有、バージョン依存のライブラリ
/usr/local/lib/ruby/site_ruby/VERSION/ARCH   サイト固有、システム依存、拡張ライブラリ
/usr/local/lib/ruby/site_ruby                サイト固有ライブラリ
/usr/local/lib/ruby/VERSION                  標準ライブラリ
/usr/local/lib/ruby/VERSION/ARCH             標準、システム依存、拡張ライブラリ
.                                            カレントディレクトリ

$SAFE が 0 でなければカレントディレクトリは含まれ ません。

*4 上記で VERSION は、1.6, 1.7 等になります。ARCH は、マシン、OSを表す Config::CONFIG['arch']の値です。

require 'foo' としたとき foo は以下のように .rb, .so を交互 に探索します。(".so" は、共有ライブラリの拡張子で実際にはシステム 依存です。例えば、HP-UX では、require 'foo.so' とすれば、foo.sl を 探します)

/usr/local/lib/ruby/site_ruby/VERSION/foo.rb
/usr/local/lib/ruby/site_ruby/VERSION/foo.so
/usr/local/lib/ruby/site_ruby/VERSION/ARCH/foo.rb
/usr/local/lib/ruby/site_ruby/VERSION/ARCH/foo.so
  :
  :

なお、そのロードパスをコマンドラインから調べるには

$ ruby -e'puts $:'

とします。

$"

require でロードされたファイル名を含む配列。 require で同じファイルを2回ロードしないために 用いられています。 (覚え方: prevent files to be doubly quoted(loaded))

$DEBUG

この値が真であればデバッグモードになります。 -d オプションでセットされます。

デバッグモードでは、通常の実行と以下の違いがあります。

$FILENAME

仮想ファイル ARGF で現在読み込み中の(メソッド gets が今読んでいる)ファイル名。ARGF.filename と同じ。

$LOAD_PATH

$:の別名。

$stdin
$stdout
$stderr

標準入力、標準出力、標準エラー出力。

これらへの代入はリダイレクトになります。*5

$VERBOSE

冗長メッセージフラグ。Rubyインタプリタへの -vオプションでセットされます。

$KCODE

Rubyの処理する文字コード。 文字列で指定し、文字列の先頭が `E' また は `e' の場合は文字列やアクセスするファイルの内容のコードが EUC で あると仮定します。同様に `S' または `s' の場合は SJIS として処理し ます。`U' または `u' の場合は UTF-8 として処理します。`N' または `n' の場合は漢字を処理しません。デフォルトは `NONE' です。

参考

現在の実装では、$KCODE は、インタプリタの字句解析器、 Regexp の漢字フラグのデフォルト値 (正規表現リテラル, Regexp.new)、 String の以下のメソッド

upcase, downcase, swapcase, capitalize, inspect, split, gsub, scan

に影響します。

オプション変数

Ruby インタプリタのコマンドライン情報を示す一連の変数があります。 形式は $-? で ? の部分にオプションの一文字が入ります。

$-0

$/ の別名。

$-a

-a が指定されている時、真。リードオ ンリー変数。

$-d

$DEBUG の別名。

$-F

$; の別名。

$-i

-i[extension] が指定されている時、拡張子を表す 文字列を格納します。指定されていない時の値は nil です。スクリ プト内で代入することもでき、その場合は ARGV の次の ファイルを読み込み始めるタイミングで in-place 置換を開始します。

$-I

$LOAD_PATH の別名。

$-K

$KCODE の別名。

$-l

-l が指定されている時、真。リードオンリー変数。

$-p

-p が指定されている時、真。リードオ ンリー変数。

$-v
$-w

$VERBOSE の別名。


*1あらい 2001-10-02: 「システム変数」と書いている場合もある、特殊性を 強調したい場合?記述の統一をする必要あり。ちなみにあらいは「特殊変数」と いう用語を使っており、このマニュアルのいくつかにも書いてしまっている
*2この変数の利用は推奨されない obsolete を 参照
*3mswin32, mingw32, cygwin では、 ruby.dll の置き場所から相対的に決まります。djgpp, emx では、ruby.exe の位置から相対的に決まります
*4デフォルトの順序は 1.6.5 から変更されました
*5執筆者募集: もっ と詳細に。ruby-list:28178[外部]とか(一応、ドラフトはこれ ruby-dev:14601[外部])。現在の仕様は変更される可能性があります