4

我正在编写一个快速脚本,以通过 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)

我尝试了一些不同的方法,但似乎无法解决这个问题。感谢您对此的任何帮助。

4

2 回答 2

12

当你看到undefined method '[]' for 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

但是,更简单的解决方案是使用String#[]方法直接拉出正则表达式捕获:

res = t.cmd('actual command')[/Calls:\s(\d+)/,1]
res = res.to_i if res

如果正则表达式失败,nil并且您不想调用to_i.nil

我还清理了你的正则表达式,因为\d{1,}它相当于\d+.

于 2012-09-12T15:56:52.827 回答
2

您需要条件来检查匹配结果是否为零。尝试这样的事情:

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

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

于 2012-09-12T15:50:19.680 回答