2017-12-14 218 views
5

Załóżmy, że chcesz tylko przeanalizować początek dużego pliku, używając Perl 6 gramatyki. Aby uniknąć odczytu całego pliku w łańcuchu, a następnie wywołać subparse w ciągu znaków. Czy można odczytać plik podczas czytania?Czy gramatyka jest niezgodna z plikiem

Nie mogłem znaleźć żadnej metody subparsefile() w klasie Grammar, więc sądzę, że jest to trudne do wdrożenia. Ale teoretycznie powinno być możliwe, zobacz na przykład: How do I search a file for a multiline pattern without reading the whole file into memory?

+0

Czy mecz ma zostać zakotwiczony na początku pliku? –

+1

@EugeneBarsky Tak, powinna być zakotwiczona na początku lub alternatywnie zakotwiczona tak blisko początku, że opłaciłaby się nie czytać całego pliku do pamięci. –

+0

A zatem część "wirnika" rozwiązania nie jest potrzebna w takim przypadku? –

Odpowiedz

7

Obecnie nie możesz. Parsowanie czegokolwiek w tej chwili wymaga istnienia całego łańcucha w pamięci.

powiedziawszy, jeśli znasz maksymalną liczbę linii Twój wzór może rozwinąć się, można zrobić coś takiego:

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 
} 

Nie byłoby najszybszy sposób to zrobić, ale to będzie nie trzeba czytać całego pliku w pamięci.

+2

Alternatywnie, jeśli wiesz, ile znaków może mieć twój wzór, możesz spróbować pliku tekstowego '" text. ".IO.comb (halfmaxsize) .rotor (2 => - 1) -> @ chunks {@ chunks.join .subparse ($ gramatyka)} ' –