2017-12-14 58 views
5

Giả sử bạn chỉ muốn phân tích cú pháp bắt đầu của một tệp lớn sử dụng ngữ pháp Perl 6. Để tránh đọc toàn bộ tập tin vào một chuỗi, và sau đó gọi subparse trên chuỗi. Có thể làm một subparse khi đọc các tập tin?Làm ngữ pháp phân trang trên một tệp

Tôi không thể tìm thấy bất kỳ phương pháp subparsefile() nào trong lớp Grammar, vì vậy tôi đoán việc này rất khó thực hiện. Nhưng có thể trong lý thuyết, xem ví dụ: How do I search a file for a multiline pattern without reading the whole file into memory?

+0

Trận đấu có được neo vào đầu tệp không? –

+1

@EugeneBarsky Có nó nên được neo vào đầu, hoặc cách khác, neo rất gần với đầu mà nó sẽ trả hết không đọc toàn bộ tập tin vào bộ nhớ. –

+0

Vì vậy, phần 'rotor' của giải pháp là không cần thiết trong trường hợp đó? –

Trả lời

7

Hiện tại bạn không thể. Phân tích cú pháp mọi thứ vào lúc này yêu cầu toàn bộ chuỗi tồn tại trong bộ nhớ.

Có nói rằng, nếu bạn biết số lượng tối đa của dòng mô hình của bạn có thể mở rộng hơn, bạn có thể làm một cái gì đó như:

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 
} 

Nó sẽ không thể là cách nhanh nhất để làm việc đó, nhưng nó sẽ không phải đọc toàn bộ tập tin trong bộ nhớ.

+2

Cách khác, nếu bạn biết số lượng ký tự của bạn có thể tối đa, bạn có thể muốn thử một "" textfile ".IO.comb (halfmaxsize) .rotor (2 => - 1) -> @chunks {@ chunks.join .subparse ($ ngữ pháp)} ' –

Các vấn đề liên quan