【Ruby】コマンドを作ろう

「はじめてのRuby」を読んでのメモ。
今回は第3章「コマンドを作ろう」


ARGV(アーグヴイ)

ARGVは配列オブジェクトで、コマンドラインからスクリプトの引数として与えられた文字列を要素として持っている。引数から取得したデータは文字列になっているため、計算に使うときは to_i メソッドで数値化する必要がある。

puts "最初の引数": #{ARGV[0]}"
puts "2番目の引数": #{ARGV[1]"
puts "3番目の引数": #{ARGV[2}"

という内容のargv.rbファイルを作り、コマンドライン上で次のように打つ。

ruby argv.rb 1st 2nd 3rd

要素の区切りに空白を入れる点に注意。

すると、下の文が返される。

最初の引数: 1st
2番目の引数: 2nd
3番目の引数: 3rd
num0 = ARGV[0].to_i
num1 = ARGV[1].to_i
puts "#{num0} + #{num1} = #{num0 + num1}"
#数値変換


ファイルからの読み込み
filename = ARGV[0]
file = File.open(filename) 
text = file.read
print text
file.close
#コマンドライン上でファイルを指定すると、その内容を一気に表示する
print File.read(ARGV[0])
#ファイルを読み込むだけならこれでもOK

しかし、これだと全てのデータをメモリにためてしまうため、大きなファイルを扱う場合に時間とメモリを無駄に使ってしまうことになる。
この問題は、データを一行ずつ出力させることで解決できる。

filename = ARGV[0]
file = File.open(filename)
file.each_line do |line|
	print line
end
file.close
#each_line メソッドで一行ずつ読み込みと出力を行う

特定のパターンにマッチする行を出力したい場合は Regexp.new(str) を使う。

pattern = Regexp.new(ARGV[0]) #Regexp.new(str) で引数の文字列 str から正規表現オブジェクトを作成
filename = ARGV[1]

file = File.open(filename)
file.each_line do |line|
  if pattern =~ line
    print line
  end
end
file.close


メソッドの作成
def hello
  print "Hello, Ruby.\n"
end

hello()


別のファイルの取り込み
require 使いたいライブラリのファイル名 (.rb は省略可能)

あるプログラムで使った自作メソッドを別のプログラムで利用したい、といった場合などに使う。
他のプログラムから読み込んで利用するためのプログラムをライブラリという。