2017-12-14 97 views
5

Perl 6 dilbilgisi kullanarak sadece büyük bir dosyanın başlangıcını ayrıştırmak istediğinizi varsayalım. Tüm dosyayı bir dizgeye okumaktan kaçınmak için dizede subparse numaralı telefonu arayın. Dosya okunurken bir altparta yapmak mümkün mü?Bir dosya üzerinde dilbilgisi ayrımı yapın

Grammar sınıfında hiçbir subparsefile() yöntemini bulamadım, bu yüzden uygulanması zor. Ancak bu teoride mümkün olmalıdır, örneğin bkz. How do I search a file for a multiline pattern without reading the whole file into memory?

+0

Eşleşme, dosyanın başına yönlendirilecek mi? –

+1

@EugeneBarsky Evet, başlangıca sabitlenmeli veya alternatif olarak, tüm dosyayı belleğe okumayacağından ötürü başlangıçta bu kadar yakın bir şekilde demir atılmalıdır. –

+0

Yani bu durumda 'rotor' çözümünün bir parçası gerekmiyor mu? –

cevap

7

Şu anda yapamazsınız. Şu anda herhangi bir şeyi ayrıştırma, tüm dizenin bellekte bulunmasını gerektirir.

Eğer desen üzerinde genişleyebilir hatlarının maksimum sayıda biliyorsanız, böyle bir şey yapabileceğini söyledikten:

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 
} 

Bunu yapmanın en hızlı yolu olmazdı, ama bu olur tüm dosyayı hafızada okumak zorunda değilsiniz.

+2

Alternatif olarak, desenin maksimum sayıda karakter olabileceğini biliyorsanız, bir "textfile" denemek isteyebilirsiniz.IO.comb (halfmaxsize) .rotor (2 => - 1) -> @chunks {@ chunks.join .subparse ($ grammar)} –