我开始研究 Ruby,并认为我会构建一些东西;我开始在其中编写一个简单的配置文件解析器。简单的原则是你给它一个格式正确的文件,它会吐出一个设置的哈希值。例如,这是一个配置文件:
localhost: 4000;
auto: true;
这就是它所回馈的:
{"localhost" => "4000", "auto" => "true"}
现在,当使用以下代码直接输入它时,我已经让它工作了:
def spit_direct(input = "", *args)
spat = Hash.new
args.each do |arg|
if input.include? arg
strip = input.match(/#{arg}:\s(\w*);/)
spat[arg] = strip[1]
else
# error message
break
end
end
spat
end
spit_direct("localhost: 4000; auto: true;", "localhost", "auto")
# => {"localhost"=>"4000", "auto"=>"true"}
这可以按我的意愿工作,但是如果可以提供实际文件会更好。我想出了以下代码,但它似乎只返回第一个设置,而不是第二个设置:
def spit_file(input = "", *args)
spat = Hash.new
args.each do |arg|
File.open(input).each_line do |line|
if line.include? arg
strip = line.match(/#{arg}:\s(\w*);/)
spat[arg] = strip[1]
else
# error message
break
end
end
end
spat
end
如果我向它提供一个文件,该文件config.cnfg
的内容与上述几个设置文件的内容相同,如下所示:
spit_file("(path)/config.cnfg", "localhost", "auto")
它只返回:
# => {"localhost"=>"4000"}
这是为什么?我昨晚花了几个小时,但似乎无法弄清楚问题所在。