Как начать сопоставление и сохранить сопоставление с точной точки в тексте

У меня есть текст, и я пишу для него парсер, используя регулярные выражения и 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 для перехода к строкам или как?

БР, Юлия


person yuliya    schedule 11.01.2011    source источник
comment
это связанное сообщение stackoverflow.com/questions/4635833   -  person yuliya    schedule 11.01.2011
comment
я бы хлебнул файл и сопоставил блоки. таким образом, вам не придется возиться с несколько уродливым подсчетом строк   -  person matthias krull    schedule 11.01.2011
comment
возможно, вы правы, но я бы предпочел сделать это с помощью кода   -  person yuliya    schedule 11.01.2011


Ответы (2)


Вы бы изменили свой цикл 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. Этот образец оставляем читателю в качестве упражнения. :-)

person CanSpice    schedule 11.01.2011

Вы можете использовать оператор диапазона флип-флопа, чтобы начать обработку при совпадении с LOREM IPSUM и остановить при совпадении ИНДЕКС.

#!/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.
    }
}
person d5e5    schedule 11.01.2011