以前ruby從perl中借鑒了很多東西,其中之一就是全域的魔法變數,在這些變數中,估計沒有沒有哪個有$_更奇特。比如,方法gets有這個一個效果:在返回剛讀到的行資料的同時,也把這行的資料存入$_.如果你調用print方法而沒有帶參數,那麼它將會列印出$_中的內容。如果你在寫if或者while語句時,僅將一個Regex作為條件,那麼這個Regex會自動去匹配$_.這樣的話,我們可以寫出下面這個短小精悍的程式來實現在所有的行中找出那些包含郵箱地址的行。1while gets
2 if /[a-zA-Z0-9\.\-_]@[a-zA-Z0-9\.\-_]/
3 print
4 end
5end
6
但是,對於Ruby來說,這樣還不夠簡潔,我們可以這樣ARGF.each {|line| print line if line =~ /[a-zA-Z0-9\.\-_]@[a-zA-Z0-9\.\-_]/ }
呵呵,怎麼樣,吃驚了吧,一條語句就搞定了,ruby就是高效!
另外還有一個全域變數,$. 裡面的內容是檔案的總行數
還有其他的全域變數$&,&`,&' 這幾個全域變數分別用於Regex中。
當你用match或者=~去匹配一個字串和一個Regex時,結果是:$&存放字串中匹配Regex的部分,$`存放字串中$&部分的前一個字串,$'存放字串中$&部分的後一個字串。
比如
str="good day! woodfish1988@163.com It's a email"
reg=/[a-zA-Z0-9\-\._]+@[a-zA-Z0-9\-\._]+/
reg=~str
puts $`,$&,$'
結果是
good day!
woodfish1988@163.com
It's a email
同時,在匹配後全域標量$1..$9裡面存放的匹配於Regex中的各個小內容(也就是由括弧括起來的內容,具體請看Regex教程)
例如:
code="<a href='http://www.google.com'>Google</a>"
reg=/<a href='(.+)'>(.+)<\/a>/
reg=~code
puts $1,$2
結果是
http://www.google.com
Google