私は計算コストの高い検索を持ち、かつ明白な理由のためではなく、オリジナルよりも計算値をしたい:Rubyでは、計算コストの高い検索で無限値を返すのに最適です。
%x(...).each_line.find { |l| m = l.match(/^(\S+).*System(.*)/) ; break m if m }
each_line
にブロックを与えることが失敗した場合に、元の文字列を返すためfind
が必要であると思われます。私はすべての一致した行のグループをしたい場合は
、私は私はそれが「ないRubyの道」ので、私はずselect
前にI map
だ集める、map { ... }.compact
ことができますが。 (実際には許容可能なプラクティスと考えていることですか?)
私はeach_line
とそのアプローチを使用してみました、それは怠惰になっので、私は最後にfirst
を求めることもできますが、私はできなかったcompact
。 select{|x|x}
と書く必要がありました。
%x(...)
.each_line.lazy
.map { |l| l.match(/^(\S+).*System(.*)/) }
.select { |x| x } # lol, .compact pls.
.first
もっとエレガントなものがありますか?
アップデート:私は
"foo\nbar".each_line.lazy.flat_map{ |l| l.match(/([ao])/) || [] }.first
でつもりが、佳作がgrep
基づいて回答するためのシンプルなライムに行きます。
ありがとうございます: 'Regexp。last_match'はコード臭のように感じますが、明らかにRubyの一部です。 –