【问题标题】:Converting file to string and replacing string text with user input将文件转换为字符串并用用户输入替换字符串文本
【发布时间】:2016-06-06 02:23:54
【问题描述】:

我需要用用户输入替换文件solution09.txt 中的占位符NOUNVERBADJADV

Madlib 解决方案09.txt:

有一天我在看我儿子 [ADV] 和他的 [NOUN] 玩耍。他假装[名词]是[ADJ]。几分钟后,他在假装 [VERB],因为其中一个 [NOUN] 开走了。当我问他这件事时,他 [ADV] 说,嗯,当 [NOUN] [VERB] 时很有趣,因为 [NOUN] 不能真正 [VERB]。

我想我成功地将文件放入一个字符串,但我必须读取字符串,并用用户输入替换占位符。替换后,我需要输出新的 madlib。我正在将用户输入转换为变量,但我不确定如何用用户输入正确替换占位符。

当前代码:

file = File.open("solution09.txt", "r")
contents = file.read
puts "Enter a noun: "
noun = gets.chomp

puts "Enter a verb: "
verb = gets.chomp

puts "Enter an adjective: "
adj = gets.chomp

puts "Enter an adverb: "
adv = gets.chomp

if file.include?('NOUN')
  file1= file.gsub("[NOUN]", noun, "[VERB]", verb, "ADJ", adj, "ADV", adv)
end

【问题讨论】:

  • 我看到的第一个问题是 gsub 不太像那样工作。如果要进行多次替换,则需要多次调用 gsub,例如 new_string = old_string.gsub('[NOUN]', noun).gsub('[VERB]', verb) 您可以像这样对任意数量的 gsub 进行字符串化。第二个问题是您与围绕词性的 [] 不一致。 NOUN 和 VERB 有,ADJ 和 ADV 没有。第三个问题是您在 file 上调用 gsub,它是文件对象,而不是 contents,它是代表您的数据的字符串。这应该足够开始了。
  • 这正是我需要让它正确输出。谢谢!

标签: ruby string file


【解决方案1】:

您还可以构建替换哈希:

filename = "solution09.txt"
contents = File.read(filename)
replacements = {}

puts "Enter a noun: "
replacements['[NOUN]'] = gets.chomp

puts "Enter a verb: "
replacements['[VERB]'] = gets.chomp

puts "Enter an adjective: "
replacements['[ADJ]'] = gets.chomp

puts "Enter an adverb: "
replacements['[ADV]'] = gets.chomp

并将其传递给gsub:

contents.gsub(Regexp.union(replacements.keys), replacements)

Regexp.union 创建一个匹配任何给定键的模式。

【讨论】:

    【解决方案2】:

    你的代码应该是这样的

    filename = "solution09.txt"
    contents=File.read(filename)
    
    puts "Enter a noun: "
    noun=gets.chomp
    
    puts "Enter a verb: "
    verb=gets.chomp
    
    puts "Enter an adjective: "
    adj=gets.chomp
    
    puts "Enter an adverb: "
    adv=gets.chomp
    
    if contents.include?('NOUN')
      { "\[NOUN\]" => noun,
        "\[VERB\]" => verb,
        "\[ADJ\]" => adj,
        "\[ADV\]" => adv
      }.each do |key, value|
        contents.gsub!(key, value)
      end
      File.open(filename, "w") { |f| f << contents }
    end
    

    您需要单独的读写操作。还有其他方法可以做到这一点

    你可以看到如何处理单个文件指针https://stackoverflow.com/a/10173112/1380263

    您还可以使用与 shell 交互的 ruby​​ 方法并使用 sed 命令(system、反引号、peopen)

    真的取决于最适合你的情况

    【讨论】:

    • 有很多编码方法可以获得相同的结果。这是每个人都有自己的编码方式的另一个例子。
    【解决方案3】:
    file = File.read("solution09.txt")
    .gsub(/\[(NOUN|VERB|ADJ|ADV)\]/) do
      part = case $1
      when "NOUN" then "a noun"
      when "VERB" then "a verb"
      when "ADJ" then "an adjective"
      when "ADV" then "an adverb"
      end
      puts "Enter #{part}: "
      gets.chomp
    end
    

    【讨论】:

    • 这是缩短我的代码的好方法。感谢您提供解决方案!
    • 这不等同于 OPs 代码。它将提示每次更换。 (顺便说一句,您的case 语句缺少end
    • @Stefan 感谢您的指出。我意识到这不一样,但我不确定 OP 的意图。
    猜你喜欢
    • 1970-01-01
    • 2013-03-09
    • 2013-03-04
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多