未定义的方法“ gsub”,可能存在变量问题

时间:2018-12-22 00:02:59

标签: ruby

我正在尝试获取输入文本文件,并以特定方式在其中插入html标签。该文件的第一部分需要采用与第二部分不同的格式,所以我想做的是:

  1. 导入文件
  2. 清理文件
  3. 将文件分成两部分
  4. 格式化第1部分
  5. 格式化第2部分
  6. 将第1和第2部分重组为新文件

基本上我已经能够完成1-3和6的步骤,但是当我在第4步中添加时,我遇到了问题

到目前为止,这是我的代码:

file_names = ['ex_poem.txt']

file_names.each do |file_name|
  text = File.read(file_name)

  #clean the text
  # remove extra returns
  clean_text = text.gsub(/\n(\n)+/, "\n\n")

  # remove spaces from ends of lines
  clean_text = clean_text.gsub(/ +\n/, "\n")

  # remove spaces blank lines
  clean_text = clean_text.gsub(/(?<=\n) +/, "")

  # remove returns at start of doc
  clean_text = clean_text.gsub(/\A\n*/, "")

  # remove returns at end of doc
  clean_text = clean_text.gsub(/\n*\Z/, "")

  # parse out poem section
  poem = clean_text.scan(/[\s\S]*(?=\n\n@@@)/)
  poem = poem.gsub(/\A|(?<=\n)+(?!\n)+(?!\Z)/,"<p class=\"poetry-line\">")
  #  poem = poem.gsub(/\n\n/, "\n\n\n\n\n")

  # parse out notes section
  notes = clean_text.scan(/(?<=@@@\n\n)[\s\S]*/)

  puts clean_text
  puts poem
  puts notes  
end

这将引发以下错误:

poemify.2.rb:22:in `block in <main>': undefined method `gsub' for #<Array:0x00007f94b104c2c8> (NoMethodError)
  from poemify.2.rb:3:in `each'
  from poemify.2.rb:3:in `<main>'

但是如果我评论这一行

poem = poem.gsub(/\A|(?<=\n)+(?!\n)+(?!\Z)/,"<p class=\"poetry-line\">")

然后脚本运行正常。这使我感到困惑,因为我在脚本中较早的时候将.gsub变量与clean_text一起使用了poem,并且可以正常工作,但是当我将puts poem变量与.scan一起使用时,它不起作用。但是当将违规行注释掉后,poem实际上可以正常工作。

我怀疑我对初始化变量或某些东西的方式不了解非常基本的东西,但是我被卡住了。

更新:

在展示了.gsub如何将poem变成数组之后,我对正则表达式进行了重新设计,以便可以使用notes,因此.gsubpoem = clean_text.gsub(/\n(?=@@@\n\n)[\s\S]*/, "")将会是一个字符串,并且我可以按照自己了解的方式继续使用notes = clean_text.gsub(/[\s\S]*(?<=\n\n@@@\n\n)/, "")

moment

Vue.use()

1 个答案:

答案 0 :(得分:1)

iterator保存poem的结果,该结果返回scan,而不是Array

您可以在此处查看文档:{​​{3}}

String不能在gsub上调用。您可以在Arraymap,然后在每个元素上调用Array

如果扫描结果包含组,则需要gsub覆盖初始map的每个元素,它将包含map s个Array

此外,如果没有匹配项,您仍然会收到空白的Array