2011-01-11 42 views
0

我有一個文本,我寫了一個使用正則表達式和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); 

這就是例子,我需要(這是非常小:))


this is file example


我認爲我需要迭代文本直到找到單詞LOREM使用正則表達式的IPSUM這種「/^LOREM IPSUM /」,因爲它是需要文本從其開始的點(並且當我到達單詞時將文本保存在一個文件中)。 而我需要完成迭代遍歷文本時INDEX單詞fount或將文本保存在單獨的文件中。

我該如何實現它。我應該使用下一個功能進行線或什麼?

BR, 尤麗婭

+1

這是相關帖子http://stackoverflow.com/questions/4635833/ – yuliya 2011-01-11 19:48:15

回答

1

你會你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。這種模式作爲練習留給讀者。 :-)

1

當您匹配LOREM IPSUM時,您可以使用flip flop range operator開始處理,並在匹配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. 
    } 
}