2011-05-26 4 views
3
def parse(line) 
    _, remote_addr, status, request, size, referrer, http_user_agent, http_x_forwarded_for = /^([^\s]+) - (\d+) \"(.+)\" (\d+) \"(.*)\" \"([^\"]*)\" \"(.*)\"/.match(line).to_a 

    print line 
    print request 
    if request && request != nil 
     _, referrer_host, referrer_url = /^http[s]?:\/\/([^\/]+)(\/.*)/.match(referrer).to_a if referrer 
     method, full_url, _ = request.split(' ') 

in parse: private method 'split' called for nil:NilClass (NoMethodError) 

Итак, как я понимаю, что это звонит split не на веревочке, но на nil. Эта часть анализирует журнал веб-сервера. Но я не могу понять, почему он получает nil. Насколько я понимаю, это пусто.Ruby: проверить, если объект является нулевым

Некоторые из подшаблонов в регулярном выражении не удалось? Так что это ошибка веб-сервера, которая иногда генерирует неправильные строки ведения журнала?

Кстати, как мне писать в файл в рубине? Я не могу правильно прочитать это окно cmd под окнами.

+1

«Как я понимаю, это нуль.» В Ruby нет такой вещи, как 'null'. Просто «нуль». –

+0

Почему то, что получает ноль? Функция не указана в конце, и вы определяете несколько переменных ... – Amadan

+0

Знак, который я знаю. Амадан, это не мой помощник по сценарию. :) Как я понимаю, регулярное выражение бросает подматтерные совпадения в перечисленные переменные. Как функция списка в php, и когда подшаблон терпит неудачу, он просто назначает ему объект nil? – Somebody

ответ

6

Вы, кажется, есть несколько вопросов здесь, так что я буду принимать удар на то, что, как представляется, основным:

Если вы хотите увидеть, если что-то отсутствует, просто использовать .nil? - так в вашем Например, вы можете просто сказать request.nil?, который возвращает true, если это nil и false в противном случае.

+0

Спасибо, помощник. Это сработало. если! request.nil? && request;) – Somebody

+0

Hah! Это не так: D – Somebody

+0

Я поймаю запрос, который терпит неудачу, и посмотрите, почему шаблон не работает. Questiong все еще открыт. Почему это проходит утверждение? :) – Somebody

2

Для записи в файл:

File.open("file.txt", "w") do |file| 
    file.puts "whatever" 
end 

Как я пишу в комментарии выше - вы не сказали, что равна нулю. Кроме того, проверьте, содержит ли в нем referrer, что вы думаете о нем. EDIT Я вижу, что это запрос nil. Очевидно, проблема с регулярным выражением.

Используйте rubular.com, чтобы легко проверить ваше регулярное выражение. Скопируйте строку из вашего входного файла в «Ваша тестовая строка» и ваше регулярное выражение в «Ваше регулярное выражение» и настройте, пока не получите выделение в «Match result».

Кроме того, что такое «неправильные строки ведения журнала»? Если мы говорим об Apache, формат журнала настраивается.

+0

Mate ... :) Почему это проходит через это? если request && request! = nil – Somebody

+0

Да, я знаю, я просто прокомментировал это. Это должно быть невозможно. – Amadan

+0

Как проверить в Ruby, что какая-то переменная, в нашем случае это запрос не экземпляр nil? – Somebody

2

рубин 2.3.0 добавил безопасных навигационный оператор (&.), который проверяет nil перед вызовом метода.

request&.split(' ') 

Это более или менее семантически эквивалентно

!request.nil? && request.split(' ') 
Смежные вопросы