Rubyのファイル操作と正規表現を同時に覚える

思い返すとプログラミングの本ってほとんどがクソだったと思う。
「たのしいRuby」なんてその最たる例だったかも。

Ruby基本

# each
(0..10).each do |i|
  puts i
end
 
# upto
puts "upto!!!"
ary = []
2.upto(10) do |i|
  ary << i
end
puts ary

# downto
puts "downto!!!"
ary = []
10.downto(1) do |i|
  ary << i
end
puts ary

# arr.each
arr = ["hoge", "fuga", "hogehoge"]
puts arr
arr.each do |a|
  puts a
end

# times
5.times do |i|
  puts i
end

# for
names = ["taguti","nakazima","fkoji"]
for name in names
  puts name
end

# step
puts "step!!!"
ary = []
2.step(10, 3) do |i|
  ary << i
end
puts ary # 2, 5, 8

# hash.each
hash = {name: "taguti", age: 30}
hash.each do |k, v|
  puts k, v
end

# hash.each
hash = {:name => "taguti", :age => 30}
hash.each do |k, v|
  puts k, v
end

# if文
a = "hoge"
if a
  puts "ok"
end

# unless
unless a
  puts "ok"
end

# loop
#loop do
 #print "ruby"
#end

# 例外
names = ["taguti", "fkoji", "yamamoto"]
begin
  names.each do |name|
    puts name + 10
  end
rescue
  puts "str in int"
end

#Random
r_int = Random.rand
r_int_100 = Random.rand(100)

puts r_int
puts r_int_100

# split
s = "taguti,fkoji,yamamoto"
s = s.split()
puts s

Rubyファイル操作

# fはFileオブジェクト
File.open("p_test.txt", mode="rt") do |f|
  puts f
end

# each_line
File.open("p_test.txt", mode="rt") do |f|
  f.each_line do |line|
   puts line
  end
end

# foreach
File.foreach("p_test.txt") do |line|
  puts line
end

puts "\n"

# 読み込んだ行を配列として返す - readlines
s = []
File.open("p_test.txt", mode="rt") do |f|
  s  = f.readlines
end
p s

puts "\n"

# 書き込み
File.open("ruby_filewrite_test.txt", mode="w") do |f|
  f.puts("ruby_filewrite_test.txt")
  f.puts("aho")
end

とりあえず each_line と readlines さえ知っとけばいいのかなという感じ。ほかにもあるけどひとつだろっていう。
書き込みは mode=”w” なのはいいとして実際に書き込むときになぜか puts っていう。

正規表現も覚える

sub は 非貪欲マッチ gsub は 貪欲マッチ でrubyは手軽に正規表現が使える。

以下は、ファイルの内容を正規表現で検索して書き換える

puts "regex_before?: "
replace_before = gets.chomp()
puts "regex_aftter?: "
replace_after = gets.chomp()
puts replace_after 

content = []
File.open("p_test.txt", "rt") do |f|
  content = f.readlines()
end

p content

replace_content = []
content.each do |c|
  replace_content.push(c.gsub(/#{replace_before}/, replace_after))
end

p replace_content

# 書き込み
puts "do you really? -- yes or no (y / n) -- "
your_input = gets.chomp()

if your_input == "y"
  File.open("p_test.txt", "w") do |f|
    replace_content.each do |rc|
      f.puts(rc)
    end
  end
elsif your_input == "n"
end

  

# 最初に一致したものだけ置換 - 非貪欲マッチ
#content = content.sub(/#{regexp_before}/, regexp_after)
#puts content

# 一致したもの全部置換 - 貪欲マッチ
#content = content.gsub

雑感

別にこれらのrubyに大した意味はないけど、忘れない程度に。忘れていいレベルの知識ではあるけど。