最初のお題 CRUD - Ruby 版

 

CRUD の Ruby 版を作成しました。

実行サンプル

$ ruby --version
ruby 1.8.6 (2008-03-03 patchlevel 114) [i386-linux]
$ chmod +x crud.rb
$ ./crud.rb
CRUD> hello
文法エラーです。
CRUD> insert "United Kingdom" => "London"
CRUD> insert "Japan" => "Osaka"
CRUD> select ".*"
Japan => Osaka
United Kingdom => London
CRUD> insert "Japan" => "Tokyo"
Japan は既に存在します。
CRUD> update "Japan" => "Tokyo"
CRUD> select ".*"
Japan => Tokyo
United Kingdom => London
CRUD> delete "japan"
japan が見つかりませんでした。
CRUD> delete "Japan"
CRUD> select ".*"
United Kingdom => London
CRUD> exit
$ 

ソースコード

crud.rb
#!/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