Как начать сопоставление и сохранение совпадения с точной точки в тексте - PullRequest
0 голосов
/ 11 января 2011

У меня есть текст, и я пишу для него парсер, используя регулярные выражения и perl.

Я могу сопоставить то, что мне нужно, с двумя пустыми строками (я использую регулярное выражение), потому что есть шаблон, который позволяет распознавать блоки текста после двух пустых строк.

Но проблема в том, что весь текст содержит вступительную часть, а какой-то текст в конце мне не нужен.

Вот код, который соответствует тексту, когда он находит две пустые строки

#!/usr/bin/perl

use strict;
use warnings;

my $file = 'first';                    
open(my $fh, '<', $file);   
my $empty = 0;    
my $block_num = 1;    
open(OUT, '>', $block_num . '.txt');    

while (my $line = <$fh>) {  

 chomp ($line);
 if ($line =~ /^\s*$/) {  
  $empty++;      
  } elsif ($empty == 2) {     
   close(OUT);    
   open(OUT, '>', ++$block_num . '.txt');
   $empty = 0;
  } 
  else {
   $empty = 0;}
 print OUT "$line\n";

}
close(OUT);

Это пример нужного мне текста (он очень маленький :))


это пример файла


Я думаю, что мне нужно перебирать текст до того момента, пока он не найдет слово LOREM IPSUM с регулярными выражениями такого типа "/ ^ LOREM IPSUM /", потому что это точка, с которой начинается необходимый текст (и сохранить текст в одном файле, когда я достигну слова). И мне нужно закончить итерацию по тексту, когда слово INDEX установлено, или сохранить текст в отдельном файле.

Как я мог это реализовать. Должен ли я использовать next для продолжения работы со строками или как?

BR, Юлия

Ответы [ 2 ]

1 голос
/ 12 января 2011

Вы можете использовать оператор диапазона триггер , чтобы начать обработку, когда вы соответствуете LOREM IPSUM, и остановить, когда вы соответствуете INDEX.

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;

my $file = 'firsttest';

open (my $fh, '<', $file) or die "Failed to open $file: $!";

while (<$fh>){
    if (m/^LOREM IPSUM/ .. m/^INDEX/){
        #Do your other matching, processing, etc. here
        print;
        last if m/^INDEX/;#Optional, to avoid reading remaining lines.
    }
}
1 голос
/ 11 января 2011

Вы бы изменили свой цикл while на что-то вроде

my $in_lorem = 0;
while (my $line = <$fh>) {
  if( $line =~ /^LOREM IPSUM/ ) {
    $in_lorem = 1;
    next;
  }
  next unless $in_lorem;
  # your processing goes here
}

Это будет пропускать строки заголовка, пока вы не достигнете строки, которая начинается с LOREM IPSUM, после чего вы будете обрабатывать строки.

Вы бы использовали похожий шаблон для игнорирования всех строк после совпадения строк, за исключением того, что вам не нужно обрабатывать больше строк, поэтому вместо использования next вы будете использовать last. Этот образец оставлен в качестве упражнения для читателя. : -)

...