2017-12-14 14 views
5

大きなファイルの先頭部分だけをPerl 6文法を使って解析したいとします。ファイル全体を文字列に読み込まないようにするには、文字列にsubparseを呼び出します。ファイルを読むときにサブパルスを実行することは可能ですか?ファイルの文法サブパネルを実行する

subparsefile()メソッドがGrammarクラスに見つかりませんでした。実装が難しいと思います。しかし、それは理論上可能でなければなりません。例えばHow do I search a file for a multiline pattern without reading the whole file into memory?

+0

一致がファイルの先頭に固定される必要がありますか? –

+1

@EugeneBarskyはい、最初にアンカーするか、またはファイル全体をメモリに読み込まないようにするために、最初に近づけてアンカーする必要があります。 –

+0

その場合、ソリューションの「ローター」部分は必要ありませんか? –

答えて

7

現在はできません。現時点で何かを解析するには、文字列全体がメモリ内に存在する必要があります。

はあなたのパターンが終わっ拡大して最大行数を知っていれば、あなたのような何かができる、と述べた:

my $max = 3; # maximum number of lines 
for "textfile".IO.lines(:!chomp).rotor($max => -$max + 1) -> @lines { 
    @lines.join.subparse($grammar) 
    # and whatever you would like to do 
} 

それはそれを行うための最速の方法ではないでしょうが、それは希望メモリ内のファイル全体を読む必要はありません。

+2

あなたのパターンが最大限にできる文字数を知っていれば、テキストファイル ".IO.comb(halfmaxsize).rotor(2 => - 1) - > @chunks {@ chunks.join .subparse($ grammar)} ' –

関連する問題