Почему я не могу использовать метод Match для массива в ruby? - PullRequest
1 голос
/ 21 октября 2019

Мне нужно перебрать и проанализировать 108 строк из файла, а затем отсортировать их по 3 различным хэшам. (В одном итераторе.) (В Ruby)

Файл загружен в программу и в массив, который мне нужно проанализировать. В любом случае, когда я пытаюсь создать итератор, я пытаюсь использовать команду Regex Match, но получаю ошибку об неизвестном методе. Это так просто, что я не могу использовать этот метод в массиве?

lines = File.readlines('access_log')

lines.each.match(/^([:\d\.]+) .*\[.*\].*\"[A-Z]+ *(.+) HTTP/)

Это и любой другой способ, которым я пытался использовать метод match, он не работал. Это также ничего не значит для хэша, так как я еще этого не сделал.

/^([:\d\.]+) .*\[.*\].*\"[A-Z]+ *(.+) HTTP/.match(lines)

Также пытался это сделать, но выводится сообщение об ошибке, что вы не можете запустить его только на массиве. Я верю, что это то место, где мне нужно было бы связать итератор, но я в замешательстве.

1 Ответ

3 голосов
/ 21 октября 2019

Итак, что происходит, так это то, что readlines делает, что он хлебает весь текстовый файл.

Таким образом, у вас есть массив с содержимым текстового файла, разделенного новой строкой (и новая строка сохраняется в каждой строкев массиве).

После этого вы создаете файл lines.each, который выдает счетчик. Затем вы вызываете .match на перечислителе вместо самой строки

Правильный способ сделать это будет

lines.each { |line| line.match(/^([:\d\.]+) .*\[.*\].*\"[A-Z]+ *(.+) HTTP/) }

Однако вышеприведенное на самом деле ничего не сделает, потому что всевы выполняете итерацию каждого элемента и проверяете, соответствует ли он REGEX.Если вы хотите, чтобы он действительно что-то делал, попробуйте ...

  matches = lines.map { |line| line.match(/^([:\d\.]+) .*\[.*\].*\"[A-Z]+ *(.+) HTTP/) }

Помните, что метод match работает только со строками. Если match совпадает с чем-либо, он возвращает объект класса MatchData, иначе, если он ничего не соответствует - ноль.

...