3.1命令行的輸入數據
向程序傳遞數據,最簡單的方法就是使用命令行。Ruby程序中,使用ARGV這個Ruby預定義好的數組來獲取從命令行傳遞過來的數據,數組AGRV中的元素,就是在命令行中指定的腳本字符串參數。
代碼清單3.1 print_argv.rb
puts "第1個參數:#{ARGV[0]}"
puts "第2個參數:#{ARGV[1]}"
puts "第3個參數:#{ARGV[2]}"
執(zhí)行示例
ruby print_argv.rb 1st 2st 3st
第1個參數:1st
第2個參數:2st
第3個參數:3st
正確如下:
代碼清單3.3 arg_arith.rb
num0 = ARGV[0].to_i
num1 = ARGV[1].to_i
puts "#{num0} + #{num1} = #{num0 + num1}"
puts "#{num0} - #{num1} = #{num0 - num1}"
puts "#{num0} * #{num1} = #{num0 * num1}"
puts "#{num0} / #{num1} = #{num0 / num1}"
執(zhí)行示例
ruby print_argv.rb 6 2
6 + 2 = 8
6 - 2 = 4
6 * 2 = 12
6 / 2 = 3
之前錯誤的想法:
先將變量存儲在數組中,其實并不是這樣
3.2文件的讀取
3.2.1從文件中讀取內容并輸出
代碼清單 3.4 read_text.rb
filename = ARGV[0] #將文件名賦值
file = File.open(filename) #打開文件
text = file.read #讀取文件的文本數據
print text #輸出文件的文本數據
file.close #關閉文件
執(zhí)行方式:
ruby read_text.rb 文件名
ruby read_text.rb whoa.txt
與上述效果一樣,只實現讀取數據
代碼清單3.5 read_text_simple.rb
filename = ARGV[0]
text = File.read(filename)
print text
執(zhí)行方式:
ruby read_text.rb 文件名
ruby read_text.rb whoa.txt
如果不使用變量,一行代碼就可以搞定。
print File.read(ARGV[0])
執(zhí)行方式:
ruby read_text.rb 文件名
ruby read_text.rb whoa.txt
3.2.2從文件中逐行讀取內容并輸出
用Ruby讀取并輸出文件的內容,一般有以下兩個問題:
1.一下子讀取全部文件內容會很耗時
2.讀取文件的內容會暫時保存在內存中,遇到大文件時,程序坑會崩潰
因此,我們考慮每次考慮只讀一行文件:each_line方法
代碼清單 3.7 read_line.rb
filenamme = ARGV[0]
file = File.open (filenamme)
file.each_line do |line|
print line
end
file.close
執(zhí)行方式:
ruby read_line.rb 文件名
ruby read_line.rb whoa.txt
each_line方法很像each方法。each_line會對文件進行逐行處理。
3.2.3從文件中讀取指定模式的內容并輸出
Unix中有一個叫grep的命令。grep命令利用正則表達式搜索文本數據,輸出按照指定模式匹配到的行。
我們先來了解Regexp.new(str)的作用,表示把字符串str轉換為正則表達式對象。
2.5.3 :001 > Regexp.new("ruby")
=> /ruby/
代碼清單3.8 simple_grep.rb
pattern = Regexp.new(ARGV[0]) #程序根據第一個參數創(chuàng)建了正則表達式對象,并賦值給pattern
filename = ARGV[1] #把第二個參數(文件名)賦值給filename
file = File.open(filename) #打開文件,創(chuàng)建文件對象,賦值給file
file.each_line do |line| #讀取每一行數據,并賦值給變量line
if pattern =~ line #使用if語句/Ruby/ =~ line
print line #如果匹配到,則打印輸出
end
end
file.close
執(zhí)行方式:
ruby simple_grep.rb 模式 文件名
ruby simple_grep.rb wgd whoa.txt
執(zhí)行后,會打印出wgd所在的行的內容。
3.3方法的定義
def 方法名
程序
end
假設我們要定義一個輸出"Hello,Ruby."的方法。
def hello
print "Hello, Ruby.\n"
end
hello()#調用
3.4 其他文件的引用
有時,我們希望在其他程序里也能重復使用的程序的某部分。例如,在某個程序里寫好某個方法,在其他程序里調用。大部分的編程語言都提供了把多個不同程序組合為一個程序的功能。想這樣,被其他程序引用的程序,我們稱為庫(library)。
Ruby使用require方法來引用庫。
庫名可以省略后綴 .rb。
調用require方法后,Ruby會搜索指定的庫,并讀取庫的所有內容。庫內容讀取完畢后,程序才會執(zhí)行require方法后面的處理。

庫與引用庫的程序
我們來實際操作一下,將剛才完成的simple_grep.rb作為庫提供給其他程序引用。作為庫文件不用做特別的修改,我們只需把定義了simple_grep方法的文件和引用該文件的程序文件放在同一個文件夾即可。
代碼清單3.10 grep.rb
def simple_grep(pattern, filename)
file = File.open(filename) #打開文件,創(chuàng)建文件對象,賦值給file
file.each_line do |line| #讀取每一行數據,并賦值給變量line
if pattern =~ line #使用if語句/Ruby/ =~ line
print line #如果匹配到,則打印輸出
end
end
file.close
end
代碼清單 3.11 use_grep.rb
require "./grep" #讀取grep.rb(省略.rb)
pattern = Regexp.new(ARGV[0])
filename = ARGV[1]
simple_grep(pattern, filename) #調用simple_grep方法
執(zhí)行方式:
ruby use_grep.rb wgd whoa.txt
注意:庫與腳本放在同一文件夾時,需要用./來明示文件存放在當前目錄。
Ruby提供了很多便利的標準庫,都可以使用require方法加以引用。
例如,我們的程序可以引用date庫,這樣程序就可以使用返回當前日期的Date.today的方法,或者返回指定日期的Date.new方法。
require "date"
days = Date.today - Date.new(1996, 9, 7)
puts(days.to_i)