3

Ruby 正規表現が文字列以外のものと照合する場合、to_strそのオブジェクトに対してメソッドが呼び出され、照合する実際の文字列が取得されます。この動作は避けたいです。文字列ではないオブジェクトに対して正規表現を一致させたいのですが、論理的にはランダムにアクセス可能なバイトのシーケンスと考えることができ、それらへのすべてのアクセスはbyte_at()メソッドを介して仲介されます (精神的には Java のCharSequence.char_at()メソッドに似ています)。

たとえば、任意の正規表現の任意のファイルでバイト オフセットを見つけたいとします。式は複数行になる可能性があるため、一度に 1 行ずつ読み取って各行で一致を探すことはできません。ファイルが非常に大きい場合、すべてをメモリに収めることができないため、1 つの大きな文字列として読み取ることはできません。ただし、ファイルの n 番目のバイトを取得するメソッドを定義するのは簡単です (速度のために必要に応じてバッファリングとキャッシュを使用します)。

最終的には、 Ruby Quiz #137のように、完全な機能を備えたロープクラスを作成し、文字列に変換することによるパフォーマンスの低下なしに正規表現を使用できるようにしたいと考えています。

Ruby の正規表現の実装の内部に深く入り込みたくないので、洞察をいただければ幸いです。

4

1 に答える 1

3

できません。これは Ruby 1.8 ではサポートされていません。x、おそらくそれはそのようなエッジケースだからです。1.9 では意味がありません。Ruby 1.9 では、ユーザーが操作できる方法で文字列をバイトにマップしません。代わりに文字コード ポイントを使用するため、受け入れる多数のエンコーディングをサポートできます。また、1.9 の新しい最適化された正規表現エンジンである鬼車も、同じエンコーディングとコード ポイントの概念に基づいて構築されています。このレベルでは、バイトはまったく関係ありません。

あなたが求めているのは時期尚早の最適化のケースであると私は疑っています。適切な Ruby オブジェクトの場合、to_strを実装することでパフォーマンスが大幅に低下することはありません。そうであれば、Ruby はおそらくあなたにとって不適切なツールです。Ruby はあらゆる方法で生データを抽象化し、隔離するからです。

大きなバイナリ ファイルでバイト シーケンスを検索する例は、Ruby の理想的な使用例ではありません。grepやその他の Unix ツールを使用する方がよいでしょう。Ruby プログラムで結果が必要な場合は、バックティックを使用してシステム プロセスとして実行し、出力を処理します。

于 2009-10-26T03:22:37.597 に答える