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方法后面的处理。
库与引用库的程序
我们来实际操作一下,将刚才完成的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)