Ruby:检查对象是否为空。

16
  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。据我所知,它表示空值。

正则表达式中的一些子模式失败了吗?那么这就是Web服务器的问题,有时会生成错误的日志字符串?

顺便问一下,我如何在Ruby中写入文件?我无法在Windows的命令行窗口下正确读取。


1
据我所知,它是null。在Ruby中并不存在null,只有nil - Mark Szymanski
为什么会得到 nil 呢?函数没有完全列出,并且您定义了多个变量... - Amadan
我知道,Amadan,这不是我的脚本。 :) 就我所知,正则表达式将子模式匹配到列出的变量中。就像 PHP 中的列表函数一样,当子模式失败时,它只会将 nil 对象分配给它,对吧? - Somebody
实际上,等等,这没有任何意义。你确定你粘贴正确了吗?如果 request 是 nil,就像你的错误提示一样,它不可能通过 if request 的保护。 (顺便说一句:if request && request != nil 是多余的 - 如果请求存在,if request != nil 将始终为 true,这使得后者足够)。 - Amadan
不,据我理解它在 require 上抛出了语法错误。 :D - Somebody
显示剩余4条评论
3个回答

37

看起来你有一些问题,我来回答主要的一个:

如果你想判断某个东西是否为空(nil),就可以使用.nil? - 在你的例子中,你可以直接使用request.nil?,如果它是nil, 将返回true,否则返回false


我会捕获请求失败的情况并查看为什么模式会失败。问题仍然存在。为什么它通过了语句? :) - Somebody

10
Ruby 2.3.0新增了一个安全导航运算符(&.),在调用方法前会检查是否为nil。
request&.split(' ')

这在功能上等同于。
!request.nil? && request.split(' ')

*(它们略有不同。当 requestnil 时,上面的表达式评估为 nil,而下面的表达式评估为 false。)

3

写入文件:

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

正如我在上面的评论中所写-你没有说"什么是nil"。同时,请检查referrer是否包含您认为它包含的内容。编辑我看到是请求nil。显然,这是正则表达式的问题。
使用rubular.com轻松测试您的正则表达式。将输入文件中的一行复制到"Your test string"中,将您的正则表达式复制到"Your regular expression"中,并进行微调,直到在"Match result"中获得高亮显示。
此外,“错误的日志字符串”是什么?如果我们谈论Apache,则日志格式是可配置的。

是的,我知道,我刚才已经评论过了。那应该是不可能的。 - Amadan
如何在Ruby中检查某个变量(在我们的情况下是请求)不是nil实例? - Somebody
如果 request 不为空,则 if request 就足够了(在 Ruby 中,nilfalse 是唯一会导致 if 失败的值,在这里你不可能得到 false 来混淆问题)。 - Amadan
1
不,是当前目录。如果您位于/path/to/my/prompt,但使用/path/to/my/script.rb启动脚本,则它将把文件写入为/path/to/my/prompt/file.txt。只有当您也在那里时,它才会在ruby脚本的目录中写入。 - Amadan
我将失败的请求写入文件。那么我会在那里看到什么?一个空格吗? - Somebody
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接