おもう
desired_portion_lines = ""
text.each_line do |line|
desired_portion_lines << line if line =~ /start_regex/ .. line =~ /finish_regex/
end
完全に受け入れられます。この..
演算子は非常に強力ですが、多くの人には使用されていません。おそらく、演算子の機能を理解していないためです。使い慣れていないため、奇妙またはぎこちなく見えるかもしれませんが、次第に慣れていきます。これは、Perl でテキスト ファイル内の行の範囲を処理するときに非常に一般的であり、私が最初に遭遇した場所であり、最終的には頻繁に使用していました。
私が別の方法で行う唯一のことは、括弧を追加して、論理テストを互いに、および行の残りの部分から視覚的に分離することです。
desired_portion_lines = ""
text.each_line do |line|
desired_portion_lines << line if ( (line =~ /start_regex/) .. (line =~ /finish_regex/) )
end
Ruby (および Perl) のコーダーは括弧の使用を嫌うようですが、論理テストを視覚的に分離するのに役立つと思います。私にとってそれは読みやすさであり、ひいてはメンテナンスのことです。
私が考えることができる唯一の他のことは、配列に変更desired_portion_lines
して、選択した行をその上にプッシュすることです。現在、desired_portion_lines << line
文字列への追加を使用して、毎回変更しています。配列をプッシュしてから、後でその要素を結合して文字列を作成する方が速い場合があります。
最初の例に戻ります。私はこれをテストしませんでしたが、次のように単純化できると思います。
desired_portion = text.each_line.find_all { |line| line =~ /start_regex/ .. line =~ /finish_regex/ }.join
フリップフロップを使用してファイル内のすべての行を反復することの唯一の欠点は、開始パターンが複数回発生する可能性がある場合、見つかった各ブロックが に追加されることdesired_portion
です。