第3章 创建命令

3.1命令行的输入数据

向程序传递数据,最简单的方法就是使用命令行。Ruby程序中,使用ARGV这个Ruby预定义好的数组来获取从命令行传递过来的数据,数组AGRV中的元素,就是在命令行中指定的脚本字符串参数。

代码清单3.1 print_argv.rb

puts "第1个参数:#{ARGV[0]}"
puts "第2个参数:#{ARGV[1]}"
puts "第3个参数:#{ARGV[2]}"

执行示例

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}"

执行示例

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                  #关闭文件

执行方式:

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                  

执行方式:

ruby read_text.rb 文件名
ruby read_text.rb whoa.txt

如果不使用变量,一行代码就可以搞定。

print File.read(ARGV[0])

执行方式:

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    

执行方式:

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])   #程序根据第一个参数创建了正则表达式对象,并赋值给pattern
filename = ARGV[1]     #把第二个参数(文件名)赋值给filename

file = File.open(filename) #打开文件,创建文件对象,赋值给file
file.each_line do |line|    #读取每一行数据,并赋值给变量line
    if pattern =~ line      #使用if语句/Ruby/ =~ line
        print line          #如果匹配到,则打印输出
    end
end
file.close

执行方式:

ruby simple_grep.rb 模式 文件名
ruby simple_grep.rb wgd whoa.txt

执行后,会打印出wgd所在的行的内容。

3.3方法的定义

def 方法名
    程序
end

假设我们要定义一个输出"Hello,Ruby."的方法。

def hello
   print "Hello, Ruby.\n"
end

hello()#调用

3.4 其他文件的引用

有时,我们希望在其他程序里也能重复使用的程序的某部分。例如,在某个程序里写好某个方法,在其他程序里调用。大部分的编程语言都提供了把多个不同程序组合为一个程序的功能。想这样,被其他程序引用的程序,我们称为库(library)。
Ruby使用require方法来引用库。
库名可以省略后缀 .rb。
调用require方法后,Ruby会搜索指定的库,并读取库的所有内容。库内容读取完毕后,程序才会执行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) #打开文件,创建文件对象,赋值给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方法

执行方式:

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)

你可能感兴趣的:(第3章 创建命令)