?
? ????? PHP ??? ???? ??? ?? ??
本參考手冊(cè)使用下列術(shù)語(yǔ).
所有以`$'開頭的變量
全局變量中的內(nèi)部變量(本網(wǎng)頁(yè)介紹的變量)
內(nèi)部變量中,形如"`$' + 1位數(shù)字或符號(hào)"的變量
內(nèi)部變量中,由命令行選項(xiàng)設(shè)定的變量,形如"`$-' +1個(gè)選項(xiàng)字符"
有時(shí),內(nèi)部變量(有特殊的功能和用途)的有效作用域不只限于全局,盡管如此,上述定義還是把它們劃入到全局變量的范疇中(可以在任何地方使用內(nèi)部變量,從這種意義上說它們是全局的,但它們的值并不只限于全局).
根據(jù)變量值的作用域的不同,大致將內(nèi)部變量劃分如下.
下列也可看做是線程內(nèi)的局部變量.
$_
gets
或readline
最后讀入的字符串.若遇到EOF則為nil.該變量的作用域是局部域.(記憶方法:與 Perl相同)
$&
在當(dāng)前作用域中,正則表達(dá)式最后一次匹配成功的字符串.若最后一次匹配失敗,則為nil.(記憶方法: 它和某些編輯器中的&
是相同的)
等同于Regexp.last_match[0].
$~
在當(dāng)前作用域中,最后一次匹配成功的相關(guān)信息(MatchData對(duì)象).若對(duì)其進(jìn)行設(shè)定的話, 則$&
以及$1 ... $9
等的值也會(huì)發(fā)生變化.
可以使用$~[n]
的形式從該數(shù)據(jù)中抽取第n個(gè)匹配結(jié)果($n).(記憶方法: ~ 是用來進(jìn)行匹配的)
等同于Regexp.last_match.
$`
在當(dāng)前作用域中,正則表達(dá)式最后一次匹配成功的字符串前面的字符串.若最后的匹配失敗則為nil.(記憶方法: `
被放在字符串前面)
等同于Regexp.last_match.pre_match.
$'
在當(dāng)前作用域中,正則表達(dá)式最后一次匹配成功的字符串后面的字符串.若最后的匹配失敗則為nil.(記憶方法: '
被放在字符串后面)
等同于Regexp.last_match.post_match.
$+
在當(dāng)前作用域中,正則表達(dá)式最后一次匹配成功的字符串部分中,與最后一個(gè)括號(hào)相對(duì)應(yīng)的那部分字符串.若最后的匹配失敗則為nil.在多項(xiàng)選擇型匹配模型中,若您無(wú)法斷定是哪個(gè)部分匹配成功時(shí),該變量將會(huì)非常有用.(記憶方法: be positive and forward looking.)
$1
$2
$3 ...
分別存儲(chǔ)著最后一次模型匹配成功時(shí)與第n個(gè)括號(hào)相匹配的值.若沒有相應(yīng)的括號(hào)時(shí),其值為nil.(記憶方法: 類似于 \數(shù)字)
等同于Regexp.last_match[1], Regexp.last_match[2],...
下列變量在一個(gè)線程內(nèi)部時(shí)是全局域變量,但在不同的線程之間是彼此獨(dú)立的.
$?
本線程中最后結(jié)束的子進(jìn)程的狀態(tài)值. 1.6版本以前是整數(shù),從1.7版本開始變?yōu)?font color="blue">Process::Status對(duì)象.另外,請(qǐng)參考Process#wait等.
整數(shù)值就是使用wait()系統(tǒng)調(diào)用所獲得的值,要想得到子進(jìn)程的exit status的話,還得除以256($?/256). 1.7版本以后還可以使用Process::Status#exitstatus.
$!
最近發(fā)生的異常的信息.由raise設(shè)定.
$@
以數(shù)組形式保存著發(fā)生異常時(shí)的back trace信息. 數(shù)組元素是字符串,它顯示了方法調(diào)用的位置,其形式為
"filename:line"
或
"filename:line:in `methodname'"
這和caller的返回值形式一致。
在向$@
賦值時(shí),$!不能為nil。調(diào)用$@的方法與$!.backtrace相同。而賦值方法與$!.set_backtrace相同。
(記憶方法:where exception occurred at.)
$SAFE
當(dāng)前線程的安全等級(jí)。關(guān)于安全等級(jí),請(qǐng)參考安全模型。
與Thread.current.safe_level相同。
$=
obsolete: 該變量將被廢止。
說明在模式匹配或字符串比較中是否要區(qū)分大小寫字母的標(biāo)識(shí)。默認(rèn)值為nil。
$/
輸入記錄分隔符。默認(rèn)值為"\n"
。其運(yùn)作類似于awk
的RS變量。
若將該變量設(shè)為 nil 時(shí),將一次讀入整個(gè)文件。若設(shè)為空字符串 "" 則將是段落模式,此時(shí)會(huì)把2個(gè)以上的連續(xù)的換行符當(dāng)作記錄切分符。
不能在$/
中使用正則表達(dá)式。
(記憶方法: 在詩(shī)歌中使用 / 作為行的切分)
$\
輸出記錄分隔符。print會(huì)在最后輸出該字符串。
默認(rèn)值為nil
,此時(shí)不會(huì)輸出任何字符。
$,
默認(rèn)的切分字符。若Array#join中省略了參數(shù)時(shí)或在print的各個(gè)參數(shù)間將會(huì)輸出它。
默認(rèn)值為 nil ,等同于空字符串。
$;
當(dāng)String#split中省略參數(shù)時(shí)的切分字符。默認(rèn)值為nil,此時(shí)將進(jìn)行特殊的分割。詳情請(qǐng)參考String#split。
ruby 1.8 feature:在1.6版本中只能把字符串賦值給$;。在1.8版本中則可以將任何對(duì)象代入其中,但考慮到String#split的變更問題,還是應(yīng)該使用正則表達(dá)式。
同時(shí),為了提供兼容性,最好不要依賴于 $; 。
$.
最后讀入的輸入文件的行號(hào)。
與ARGF.lineno相同。若需要取得每個(gè)參數(shù)文件的行號(hào)時(shí),需要使用ARGF.file.lineno。
$<
由參數(shù)(若沒的話就使用標(biāo)準(zhǔn)輸入)構(gòu)成的虛擬文件。也就是常數(shù)ARGF的別名。(記憶方法: <
指定了shell的輸入源)
$deferr ((<ruby 1.8 特性>)) ((<obsolete>))
Ruby解釋器輸出錯(cuò)誤信息、警告信息和warn時(shí)的輸出對(duì)象。
只能將內(nèi)部帶有write方法的對(duì)象賦值給該變量。(warn 等內(nèi)部方法最終將調(diào)用$deferr.write方法)。
$deferr 是 $stderr 的別名。$deferr (盡管它剛出現(xiàn)不久) 將被廢止。
$>
$defout ((<obsolete>))
內(nèi)部函數(shù)print、puts或p等的默認(rèn)輸出對(duì)象。初始值為STDOUT。若指定了-i[extension]選項(xiàng)的話,則將使用與讀取源同名的文件。(記憶方法: >
指定了shell的輸出對(duì)象)
只能將內(nèi)部帶有write方法的對(duì)象賦值給該變量(print等內(nèi)部方法最終將調(diào)用write方法)。
若想改變print等Ruby內(nèi)部函數(shù)的輸出對(duì)象時(shí),可以將該變量的值設(shè)定為別的IO即可。若想要改變子進(jìn)程或C語(yǔ)言擴(kuò)展庫(kù)的標(biāo)準(zhǔn)輸出時(shí),則必須使用IO#reopen將標(biāo)準(zhǔn)輸出重定向(redirect)到別的IO。請(qǐng)參考$stdout。
ruby 1.8 特性:
$defout 是 $stdout 的別名。$defout 是obsolete。
$0
$PROGRAM_NAME ((<ruby 1.8 特性>))
當(dāng)前運(yùn)行中的Ruby腳本名.根據(jù)OS的不同,有時(shí)向該變量賦值后,ps(1)的輸出會(huì)發(fā)生變化.該功能適合于用來表示當(dāng)前程序的狀態(tài).(記憶方法: 與sh 或 ksh 相同)
$*
傳遞給Ruby腳本的參數(shù).內(nèi)部常數(shù)ARGV的別名.Ruby自身用的參數(shù)已經(jīng)被摘除.(記憶方法: 與sh 或 ksh 相同)
$$
當(dāng)前運(yùn)行中的Ruby進(jìn)程的pid。(記憶方法: 與shell相同)
與Process.pid相同.
$:
$LOAD_PATH
包含一個(gè)數(shù)組,其內(nèi)容是load或require加載文件時(shí)用的搜索目錄列表.(記憶方法: 冒號(hào)是環(huán)境變量PATH的切分符)
包含下列內(nèi)容:啟動(dòng)時(shí)-I directory 選項(xiàng)所指定的目錄,環(huán)境變量RUBYLIB的值,編譯時(shí)指定的默認(rèn)值還有"."(當(dāng)前目錄).下列就是典型的UNIX系統(tǒng)上的加載路徑.
-I 指定的路徑 環(huán)境變量 RUBYLIB 的值 /usr/local/lib/ruby/site_ruby/VERSION site固有的,取決于VERSION的庫(kù) /usr/local/lib/ruby/site_ruby/VERSION/ARCH site固有的,取決于系統(tǒng)的擴(kuò)展庫(kù) /usr/local/lib/ruby/site_ruby site固有的庫(kù) /usr/local/lib/ruby/VERSION 標(biāo)準(zhǔn)庫(kù) /usr/local/lib/ruby/VERSION/ARCH 標(biāo)準(zhǔn)的,取決于系統(tǒng)的擴(kuò)展庫(kù) . 當(dāng)前目錄
上表中的VERSION是表示Ruby版本的字符串,如"1.6"或"1.8"等.ARCH是表示硬件和OS的字符串,如"i686-linux"或"alpha-osf5.1"等.可以從Config::CONFIG['arch']中得到這些信息.
在多數(shù)UNIX系統(tǒng)中,編譯時(shí)的默認(rèn)路徑是"/usr/local/lib/ruby".在mswin32,mingw32,cygwin,bccwin32,mswince這些環(huán)境中,是以ruby.dll所在位置為起點(diǎn)的相對(duì)路徑.而在djgpp,emx(OS/2)中,則是以ruby.exe所在位置為起點(diǎn)的相對(duì)路徑.
在使用-T 選項(xiàng)啟動(dòng)時(shí),若將$SAFE設(shè)為1以上的值的話,則"." (當(dāng)前目錄)不會(huì)被納入加載路徑.
如require 'foo'
時(shí),將交互搜索.rb和.so.
/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 : :
有的系統(tǒng)的共享庫(kù)擴(kuò)展名并非.so,此時(shí)將自動(dòng)使用新的擴(kuò)展名.例如在HP-UX上require 'foo.so'時(shí)將搜索foo.sl.因此在Ruby內(nèi)部,可以一直使用.so.
若想用命令行查看加載路徑的話,可以這樣
$ ruby -e 'puts $:'
即可.
$"
$LOADED_FEATURES ((<ruby 1.8 特性>))
包含以require加載的文件名的數(shù)組.這可以防止require多次加載同一個(gè)文件.
$DEBUG
若此值為真則變成調(diào)試模式。它由-d選項(xiàng)進(jìn)行設(shè)定。
調(diào)試模式與普通的運(yùn)行有以下不同。
若某線程因發(fā)生異常而結(jié)束時(shí),整個(gè)解釋器也將中止工作。這等同于將Thread.abort_on_exception設(shè)置為true的效果,但是在調(diào)試模式中,即使在腳本中使用 abort_on_exception= 類方法來重置標(biāo)識(shí)也無(wú)法取消該效果。
在通常的運(yùn)行中,若某線程發(fā)生了異常卻并沒有被Thread#join等檢測(cè)到的話,該線程將被無(wú)警告地終止。
$FILENAME
虛擬文件ARGF中,當(dāng)前正在讀入的(gets方法正在讀的)文件名。與ARGF.filename相同。
$LOAD_PATH
$:的別名。
$stdin
$stdout
$stderr
標(biāo)準(zhǔn)輸入,標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤輸出。
ruby 1.8 特性
$stdout, $stderr 是 $defout,$deferr 的別名。($defout, $deferr 已經(jīng)廢止)
$stdout, $stderr的對(duì)應(yīng)對(duì)象中必須要有名為write的方法。詳細(xì)情況請(qǐng)參考defout,deferr。
$stdin同$stdout、$stderr一樣,即使沒有特定的方法也可以對(duì)其賦值。若執(zhí)行gets等方法時(shí),該方法將被投射到$stdin對(duì)應(yīng)的對(duì)象中。(將執(zhí)行$stdin.gets)
$stdin所對(duì)應(yīng)的對(duì)象中應(yīng)該定義下列方法。(請(qǐng)根據(jù)需要取舍)
gets, readline, readlines, getc, readchar, tell, seek, pos=, rewind, fileno, to_io, eof, each_line, each_byte, binmode, closed?
例:
$stdin = Object.new def $stdin.gets "foo" end p gets # => "foo"
若想對(duì)標(biāo)準(zhǔn)輸入、輸出、錯(cuò)誤輸出等進(jìn)行重定向(redirect)時(shí),可以使用IO#reopen(1.6版也是如此)。例如
$stdout = File.open("/tmp/foo", "w")
寫成這樣
STDOUT.reopen("/tmp/foo", "w")
就可以了。若想取消重定向時(shí)
stdout_sv = STDOUT.dup # 保存 STDOUT STDOUT.reopen("/tmp/foo") # 將 STDOUT 重定向到 /tmp/foo puts "foo" # 輸出到 /tmp/foo STDOUT.flush # 必須(?) STDOUT.reopen(stdout_sv) # 恢復(fù)原狀
就可以了。若您不想讓重定向影響到子進(jìn)程的話,只要向$stdout等賦值就足夠了。
# 改變輸出方法的默認(rèn)輸出對(duì)象 $stdout = File.open("/tmp/foo", "w") puts "foo" # 取回輸出方法的默認(rèn)輸出對(duì)象。 $stdout = STDOUT
ruby 1.6 特性: 向$stdin、$stdout、$stderr賦值時(shí),會(huì)進(jìn)行重定向。
ruby 1.7 特性: 暫時(shí)修改了重定向的運(yùn)作方式[ruby-dev:14601]。
$VERBOSE
冗長(zhǎng)消息標(biāo)識(shí)。由面向Ruby解釋器的-v選項(xiàng)進(jìn)行設(shè)定。
ruby 1.8 特性
警告等級(jí)分為三級(jí),分別如下。
可以使用命令行選項(xiàng)-W[level]來指定警告等級(jí),分別為-W0、-W1、-W2 (or -W)。指定-v或-w時(shí),等同于-W2。
若設(shè)定為nil、false之外的值時(shí),其值為變?yōu)閠rue。
$KCODE
Ruby可識(shí)別的多字節(jié)字符串的編碼。變量值為"EUC" "SJIS" "UTF8" "NONE"之一。
當(dāng)$KCODE的值為"EUC"時(shí),將假定字符串或正則表達(dá)式的編碼為EUC-JP。同樣地,若為"SJIS"時(shí)則認(rèn)定為Shift JIS。若為"UTF8"時(shí)則認(rèn)定為UTF-8。若為"NONE"時(shí),將不會(huì)識(shí)別多字節(jié)字符串。
在向該變量賦值時(shí),只有第1個(gè)字節(jié)起作用,且不區(qū)分大小寫字母。"e" "E" 代表 "EUC","s" "S" 代表 "SJIS","u" "U" 代表 "UTF8",而"n" "N" 則代表 "NONE"。
默認(rèn)值為"NONE"。
[參考]
目前$KCODE
將對(duì)Ruby的下列動(dòng)作產(chǎn)生影響。
用來顯示Ruby解釋器命令行信息的變量。其形式為$-?
,?的部分是1位選項(xiàng)字符。
$-0
$/ 的別名。
$-a
若指定了-a時(shí),其值為真。只讀變量。
$-d
$DEBUG 的別名。
$-F
$; 的別名。
$-i
若指定了-i[extension]時(shí),它將保存擴(kuò)展名字符串。否則其值為nil。也可以在腳本中對(duì)其進(jìn)行賦值,此時(shí)將在開始讀入ARGV中的下一個(gè)文件之前進(jìn)行in-place替換。
$-I
$LOAD_PATH 的別名。
$-K
$KCODE 的別名。
$-l
若指定了-l時(shí),其值為真。只讀變量。
$-p
若指定了-p時(shí),其值為真。只讀變量。
$-v
$-w
$VERBOSE 的別名。
$-W ((<ruby 1.9 特性>))
返回由-W[level]指定的值。
也就是說,根據(jù)$VERBOSE的取值不同
而返回上述諸值之一。只讀變量。