неопределенный метод `gsub ', возможная проблема с переменными - PullRequest
0 голосов
/ 22 декабря 2018

Я пытаюсь взять входной текстовый файл и вставить в него HTML-теги определенным образом.Первая часть файла должна быть отформатирована иначе, чем вторая, поэтому я пытаюсь сделать следующее:

  1. Импортировать файл
  2. Очиститьfile
  3. Разделить файл на 2 части
  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 были бы строкой, и я мог бы продолжать работать с .gsub так, как я понимаю:

poem = clean_text.gsub(/\n(?=@@@\n\n)[\s\S]*/, "")

notes = clean_text.gsub(/[\s\S]*(?<=\n\n@@@\n\n)/, "")

1 Ответ

0 голосов
/ 22 декабря 2018

poem содержит результаты scan, который возвращает Array, а не String.

. Вы можете увидеть документы здесь: https://ruby -doc.org/core-2.2.0/String.html#method-i-scan

gsub не может быть вызван на Array.Вы можете map над Array и вызывать gsub для каждого элемента.

Если результаты вашего сканирования содержат группы, вам нужно будет map над каждым элементом исходного map, это будетсодержит Array из Array с.

Кроме того, если совпадений нет, вы все равно получите пустой Array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...