第3章 創(chuàng)建命令

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方法后面的處理。

截屏2021-01-25 上午11.12.36.png

庫與引用庫的程序
我們來實際操作一下,將剛才完成的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)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 本文轉載自圖靈社區(qū)用戶青年的翻譯文章。 我使用 Git 大約已經有18個月時間,自認為能很好地駕馭它了。但是當我們...
    圖靈教育閱讀 1,065評論 1 25
  • 由于工程項目中擬采用一種簡便高效的數據交換格式,百度了一下發(fā)現除了采用 xml、JSON 還有 ProtoBuf(...
    黃海佳閱讀 49,146評論 1 23
  • redis集群分為服務端集群和客戶端分片,redis3.0以上版本實現了集群機制,即服務端集群,3.0以下使用客戶...
    hadoop_null閱讀 1,675評論 0 6
  • IO(input/output) 即輸入輸出對象。在程序啟動時就會分配三個IO對象,分別為標出輸入、標準輸出和錯誤...
    威爾士的海閱讀 1,456評論 0 1
  • 推薦指數: 6.0 書籍主旨關鍵詞:特權、焦點、注意力、語言聯想、情景聯想 觀點: 1.統(tǒng)計學現在叫數據分析,社會...
    Jenaral閱讀 5,952評論 0 5

友情鏈接更多精彩內容