Ruby 未定义的方法';[]和#x27;零级:零级

Ruby 未定义的方法';[]和#x27;零级:零级,ruby,Ruby,我正在编写一个快速脚本,通过telnet从具有CLI的设备提取数据。对于我不确定如何处理的错误,我需要一些帮助 res = nil res = t.cmd('actual command').match(/Calls:\s(\d{1,})/)[1].to_i 在某些情况下,该设备可以快速打印出各种自动输出。此外,在此期间,设备有时不会返回所有输出,从而导致不匹配。因此,我得到以下错误: in `<main>': undefined method `[]' for nil:NilCl

我正在编写一个快速脚本,通过telnet从具有CLI的设备提取数据。对于我不确定如何处理的错误,我需要一些帮助

res = nil
res = t.cmd('actual command').match(/Calls:\s(\d{1,})/)[1].to_i
在某些情况下,该设备可以快速打印出各种自动输出。此外,在此期间,设备有时不会返回所有输出,从而导致不匹配。因此,我得到以下错误:

in `<main>': undefined method `[]' for nil:NilClass (NoMethodError)
in`:nil:NilClass(NoMethodError)的未定义方法“[]”

我尝试了一些不同的方法,但似乎无法克服这个问题。谢谢你在这方面的帮助

您需要条件来检查匹配结果是否为零。试着这样做:

res = nil
res = t.cmd('actual command').match(/Calls:\s(\d{1,})/)[1].to_i rescue nil

res变量将保持为nil,因此您可以稍后使用此信息进行一些检查。

当您看到nil:NilClass的
未定义方法“[]”时,它意味着:

嘿!您的值是
nil
,后跟
[…]
,但
nil
没有此方法

在这种情况下,您的问题是,
match(…)
有时无法匹配您想要的文本,返回
nil
,然后您不能要求
[1]
。避免这种情况的一些直接方法是:

match = t.cmd('actual command').match(/Calls:\s(\d{1,})/)
res = match && match[1].to_i

# or
res = match[1].to_i if match

# or 
res = if (match=t.cmd('actual command').match(/Calls:\s(\d{1,})/))
  match[1].to_i
end

# or
res = (match=t.cmd('actual command').match(/Calls:\s(\d{1,})/)) && match[1].to_i
但是,更简单的解决方案是使用该方法直接拉出正则表达式捕获:

res = t.cmd('actual command')[/Calls:\s(\d+)/,1]
res = res.to_i if res
如果正则表达式失败,此表单会自动为您返回
nil
,并且您不想在
nil
上调用
to_i


我还清理了一下您的正则表达式,因为
\d{1,}
相当于
\d+

请注意,使用
rescue nil
通常是不受欢迎的,因为(a)它可以隐藏任何数量的其他问题,(b)使用异常处理比自己检查和避免异常要慢得多。此外,在这一行之前,没有必要将
res
设置为
nil
。我不皱眉头,因为有时需要隐藏这样的问题。最后的
rescue nil
允许匹配正则表达式行成功,没有错误“nil:NilClass(NoMethodError)的未定义方法“[]”。这是一个成功的单行程序,返回nil或期望的结果。我不知道字符串#[]可以自动完成,这是一个很好的改进!感谢您的深入解释。非常感谢。