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

如何在Ruby中添加和写入文件,ruby,Ruby,我是编程新手,希望就如何处理这个问题提供一些建议 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 = __ 我有一个包含10个数学问题的文件,但似乎不知道如何用每个问题的答案替换下划线 1. 1 + 3 = __ 2. 2 + 2 = __ 3. 0 + 9 = __

我是编程新手,希望就如何处理这个问题提供一些建议

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 = __
我有一个包含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
从字符串中提取操作数和运算符 您必须以某种方式从行中提取操作数和运算符。我会使用:

  • ([-]?\d+)
    是第一个捕获组
    • [-]?
      匹配文字字符
      -
      零次或一次
    • \d+
      将数字(0-9)匹配一次或多次
  • ([-+*\/])
    是第二个捕获组
    • [-+*\/]
      匹配字符
      -
      +
      *
      /
      (必须转义)一次
  • ([-]?\d+)
    是第三个捕获组,与第一个相同
示例使用:

它们还存储在(从左到右)
$1
$2
$3
中:

re.match("7. 6 + 4 = __")  #=> #<MatchData "6 + 4" 1:"6" 2:"+" 3:"4">
$1 #=> "6"
$2 #=> "+"
$3 #=> "4"
但我已经硬编码了。要使方法调用动态,我们必须使用:

用值替换占位符 最后,我们必须用我们的结果替换
\uuu
。这可以通过以下方式实现:


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

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

out=File.open(“out.txt”,“w+”)
File.open(“math1.txt”,“r+”)do | File|
file.u每行do |行|
计算=eval(行分割(“.”[1]。分割(“=”[0])
out.write(第二行(“计算到”)
结束
结束

显示读取文本文件的代码。最简单的方法是:将文件读入数据结构,更改数据,将数据结构写入文件。只有在替换相同数量的字符时才能更改文件,这比重新创建文件要敏感得多。谢谢,Stefan,您是否介意尝试解释如何使代码工作,例如从行中提取操作数和运算符并完成代码,我对这一点不熟悉,对我来说似乎很难。提前感谢。
eval
在解析来自外部源的文件时非常危险。如果文件包含一行,如
“`rm-rf/`=“
”,您可以插入一个过滤器,例如删除$and`。但是我假设该文件来自可靠的源代码,我想展示一个更简单的示例。非常感谢,我很感激。实现一个过滤器,例如删除
“`
,根本解决不了问题。调用系统命令或仅仅使用Ruby做危险的事情还有太多其他方法。对来自可靠来源的文件使用
eval
,基本上等同于允许该文件的作者在一段时间内不被注意地使用您的计算机。它允许他做任何事情:读取、复制或上传文件(ssh密钥有人吗?),操纵数据或为系统添加后门。他还可以在造成伤害后清理文件以覆盖轨迹……您将如何执行过滤掉`和$的系统命令?您可以使用reg exp只允许0-9,+-感谢您的快速响应,我们将尝试这样做。再次感谢。
m = re.match("7. 6 + 4 = __")  #=> #<MatchData "6 + 4" 1:"6" 2:"+" 3:"4">
m[1] #=> "6"
m[2] #=> "+"
m[3] #=> "4"
re.match("7. 6 + 4 = __")  #=> #<MatchData "6 + 4" 1:"6" 2:"+" 3:"4">
$1 #=> "6"
$2 #=> "+"
$3 #=> "4"
$1.to_i #=> 6
$3.to_i #=> 4

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