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

一致する結果がnilであるかどうかを確認するための条件が必要です。次のようなものを試してください。

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

res変数はnilのままなので、後でこの情報を使用していくつかのチェックを行うことができます。

于 2012-09-12T15:50:19.680 に答える