#!/usr/bin/ruby -Ku
class CRUD
def initialize
@h = {}
end
def insert(arg0, arg1)
raise "#{arg0} は既に存在します。" if @h.key?(arg0)
@h[arg0] = arg1
end
def select(arg0)
p = Regexp.new(arg0)
@h.each do |key, val|
print "#{key} => #{val}\n" if p =~ key
end
end
def update(arg0, arg1)
raise "#{arg0} が見つかりませんでした。" if ! @h.key?(arg0)
@h[arg0] = arg1
end
def delete(arg0)
raise "#{arg0} が見つかりませんでした。" if ! @h.key?(arg0)
@h.delete(arg0)
end
end
def parse(s)
p0 = /^$/ # CRUD>
p1 = /^([a-z]+).*$/ # CRUD> cmd .....
p2 = /^([a-z]+)$/ # CRUD> cmd
p3 = /^([a-z]+)\s+"([^"]+)"$/ # CRUD> cmd "arg0"
p4 = /^([a-z]+)\s+"([^"]+)"\s*=>\s*"([^"]+)"$/ # CRUD> cmd "arg0" => "arg1"
s.strip!
if p0 =~ s
return { :cmd => '' }
elsif p1 =~ s
case $1
when 'exit'
return { :cmd => $1 } if p2 =~ s
when 'select', 'delete'
return { :cmd => $1, :arg0 => $2 } if p3 =~ s
when 'insert', 'update'
return { :cmd => $1, :arg0 => $2, :arg1 => $3 } if p4 =~ s
end
end
raise '文法エラーです。'
end
crud = CRUD.new
loop do
begin
print 'CRUD> '
r = parse(gets)
case r[:cmd]
when 'insert'
crud.insert(r[:arg0], r[:arg1])
when 'select'
crud.select(r[:arg0])
when 'update'
crud.update(r[:arg0], r[:arg1])
when 'delete'
crud.delete(r[:arg0])
when 'exit'
exit
when ''
end
rescue => e
puts e.message
end
end
|