Ruby:检查对象是否为零

时间:2011-05-26 18:57:33

标签: ruby

  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。 这部分是解析Web服务器日志。但是我无法理解为什么会得到nil。据我所知,它是空的。

正则表达式中的一些子模式失败了吗?所以这是网络服务器的错,有时会生成错误的日志字符串?

顺便问一下,如何在ruby中写入文件?我无法在Windows下的这个cmd窗口中正确阅读。

3 个答案:

答案 0 :(得分:15)

你似乎在这里有几个问题,所以我会尝试一下似乎是主要的问题:

如果您想查看某些内容是否为零,请使用.nil? - 所以在您的示例中,您可以说request.nil?,如果true则返回nil }和false否则。

答案 1 :(得分:3)

要写入文件:

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

当我在上面的评论中写道时 - 你没有说 是什么。另外,请检查referrer是否包含您认为包含的内容。 编辑我看到它的请求是nil。显然,regexp麻烦。

使用rubular.com轻松测试正则表达式。将输入文件中的一行复制到“您的测试字符串”中,并将正则表达式复制到“您的正则表达式”中,然后进行调整,直到您在“匹配结果”中获得突出显示。

另外,什么是“错误的记录字符串”?如果我们正在谈论Apache,日志格式是可配置的。

答案 2 :(得分:3)

Ruby 2.3.0添加了一个安全导航操作符&.),在调用方法之前检查nil

request&.split(' ')

这或多或少在语义上等同于

!request.nil? && request.split(' ')