如何在Ruby中添加和写入文件

时间:2016-06-04 07:11:45

标签: ruby

我是编程新手,想了解如何处理这个问题。

我有一个包含10个数学问题的文件,但似乎无法弄清楚如何用每个问题的答案替换下划线。

1. 1 + 3 = __
2. 2 + 2 = __
3. 0 + 9 = __
4. 3 + 4 = __
5. 5 + 2 = __
6. 2 + 5 = __
7. 6 + 4 = __
8. 7 + 1 = __
9. 9 + 9 = __
10. 10 + -1 = __

我可以打开文本文件并从中读取,但似乎无法找到添加它们的方法,并使用正确的答案删除下划线。

这是从文件中读取的代码。

File.open("math1.txt", 'r+') do |file|
  file.each_line do |line|
    puts line
  end
end

2 个答案:

答案 0 :(得分:1)

从字符串

中提取操作数和运算符

你必须以某种方式从行中提取操作数和运算符。我使用regular expression

re = /([-]?\d+) ([-+*\/]) ([-]?\d+)/
  • ([-]?\d+)是第一个捕获组
    • [-]?匹配文字字符-零次或一次
    • \d+匹配一个数字(0-9)一次或多次
  • ([-+*\/])是第二个捕获组
    • [-+*\/]匹配字符-+*/(必须转义)
  • ([-]?\d+)是第3个捕获组,与第1个相同

使用match的示例:

re.match("1. 1 + 3 = __")  #=> #<MatchData "1 + 3" 1:"1" 2:"+" 3:"3">
re.match("7. 6 + 4 = __")  #=> #<MatchData "6 + 4" 1:"6" 2:"+" 3:"4">
re.match("10. 10 + -1")    #=> #<MatchData "10 + -1" 1:"10" 2:"+" 3:"-1">

可以从MatchData

中检索捕获组
m = re.match("7. 6 + 4 = __")  #=> #<MatchData "6 + 4" 1:"6" 2:"+" 3:"4">
m[1] #=> "6"
m[2] #=> "+"
m[3] #=> "4"

它们也会在special global variables $1$2$3中存储(从左到右):

re.match("7. 6 + 4 = __")  #=> #<MatchData "6 + 4" 1:"6" 2:"+" 3:"4">
$1 #=> "6"
$2 #=> "+"
$3 #=> "4"

使用动态操作数和运算符

执行计算

请注意,这些仍然是字符串。我们必须通过to_i将它们转换为整数才能对它们执行操作:

$1.to_i #=> 6
$3.to_i #=> 4

$1.to_i + $3.to_i #=> 10

但我已对+进行了硬编码。要使方法调用为动态,我们必须使用send

6.send("+", 4)             #=> 10
$1.to_i.send($2, $3.to_i)  #=> 10

用值

替换占位符

最后,我们必须将__替换为我们的结果。这可以通过sub

完成
"7. 6 + 4 = __".sub("__", "10")
#=> "7. 6 + 4 = 10"

就是这样。现在,您必须将这些步骤合并到循环中。

答案 1 :(得分:1)

这将是一个简单的解决方案

out = File.open("out.txt",'w+')
File.open("math1.txt", 'r+') do |file|
  file.each_line do |line|
    calc = eval(line.split(".")[1].split("=")[0])
    out.write(line.sub('__',calc.to_s))
  end
end