このマニュアルでは、`$'で始まる変数を「グローバル変数」と呼んでいますが *1 組み込みの変数(これらは特殊な機能と用途を持ちます)の中にはその有効なス コープがグローバルとは限らない場合があります(どこでも使えるという意味で はグローバルですが、その値はグローバルとは限りません)。ここでは、変数の 値のスコープで大別してグローバル変数の一覧を列挙します。
以下の変数はスレッドローカルでもあります。
$_
最後に gets
または readline
で読み込んだ文字列。
EOF に達した場合には、nil。この変数はローカルスコープです。
(覚え方: Perlと同じ)
$&
現在のスコープで最後に成功した正規表現のパターンマッチでマッチした
文字列。最後のマッチが失敗していた場合には nil
。
(覚え方: いくつかのエディタでの &
と同じ)
Regexp.last_match[0] と同じ。
$~
現在のスコープで最後に成功したマッチに関する情報(MatchData
オブジェクト)。これを設定すると $&
や $1 ... $9
などの
値が変化します。
このデータから n 番目のマッチ($n)を取り出すためには $~[n]
で
参照できます。
(覚え方: ~ はマッチに使われる)
Regexp.last_match と同じ。
$`
現在のスコープで最後に成功した正規表現のパターンマッチでマッチした
部分より前の文字列。最後のマッチが失敗していた場合には nil
。
(覚え方: `
は文字列の前に置かれる)
$'
現在のスコープで最後に成功した正規表現のパターンマッチでマッチした
部分より後ろの文字列。最後のマッチが失敗していた場合には nil
。
(覚え方: '
は文字列の後ろに置かれる)
$+
現在のスコープで最後に成功した正規表現のパターンマッチでマッチした
中で最後の括弧に対応する部分文字列。
最後のマッチが失敗していた場合には 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
カレントスレッドのセーフレベル。セーフレベルについては セキュリティモデルを参照してください。
$=
パターンマッチや文字列の比較でアルファベットの大文字小文字を 区別するかどうかのフラグ。デフォルトは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
組込み関数 print、puts や
p などのデフォルトの出力先。初期値は
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 と同じ。
$:
loadや require がファイルをロードする時に検索するディレクトリのリストを含む 配列。 $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 オプションでセットされます。
デバッグモードでは、通常の実行と以下の違いがあります。
いずれかのスレッドが例外によって終了した時に、インタプリタ全体 を中断します。Thread.abort_on_exception を true にセットした時と同じ効果がありますが、デバッグモードでは、スク リプト中で abort_on_exception= クラスメソッドによってフラグをリ セットしても、この効果をなくすことはできません。
通常の実行では、あるスレッドで起こった例外は、 Thread#join などで検出されない限り、そのスレッドだ けをなにも警告を出さずに終了させます。
$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[外部])。現在の仕様は変更される可能性があります