2010-11-15 27 views
0

我的文本文件中有一些塊。我假設我的文字由
組成我的文字如何使用關鍵字(關鍵字1,關鍵字2,關鍵字3,關鍵字4)來讀取文字。

我有兩個問題。
1.是否有任何方法有效地獲取每個關鍵字的下一行?
2.我不知道如何跳過關鍵字3和關鍵字4之間的內部空行。關鍵是以空白定義的塊結束。如何在塊空行結束時讀取帶/不帶空行的塊?

**block start** 

    Keyword1 
    Single Line # I need work on the line 
    Keyword2 
    Single or Multiple lines # I need work on the lines 
    Keyword3 
    (May be there is single or multiple Blank lines) 
    Single or Multiple lines # I need work on the lines 
    (May be there is single or multiple Blank lines) 
    Keyword4 
    Single or Multiple lines # I need work on the lines 
    Single or multiple Blank line 

**block end** 

回答

1

如果我瞭解您的數據,空白行不是可靠的指標,因爲它們可以出現在關鍵字的文本開始之前,文本之後或根本沒有。如果是這種情況,我認爲它不會幫助閱讀「段落模式」中的文本(通過將$/設置爲空字符串)。同樣,空白行不能幫助 - 至少不能以簡單的方式 - 識別關鍵字部分或「塊」的開始和結束。

你將不得不以更細緻的方式解析文本,但是你沒有給我們足夠的信息來提供詳細的答案。下面是一個簡單的存儲非空行通過關鍵字的例子:

use strict; 
use warnings; 

my (%data, $keyword); 

while (my $line = <DATA>){ 
    next unless $line =~ /\S/; 
    chomp $line; 
    if ($line =~ /^Keyword/){ 
     $keyword = $line; 
    } 
    else { 
     push @{$data{$keyword}}, $line; 
    } 
} 

__DATA__ 
Keyword1 
data1 a 
Keyword2 
data2 a 
data2 b 
data2 c 
Keyword3 


data3 a 
data3 b 


Keyword4 
data4 a 
data4 b 
+0

感謝您的詳細信息輸入。真的幫了我很多。 – 2010-11-16 03:30:27

1

你知道如何設置$/爲「段落模式」空字符串?

<>readline的每個調用現在都會返回多行記錄,最多可以有一個或多個空行,並且chomp會將它們全部從最後刪除。

+0

我不知道'$ /'。但是我在幾個月前使用過'<>'和'chomp'。謝謝。 – 2010-11-15 10:12:39

1

你就不能做多的比賽,並使用關鍵字作爲錨這樣的:

$data =~ /(Keyword1.*?Keyword2.*?Keyword3.*?Keyword4.*?)\n$/sm; 
my $block = $1; 

其實,你可以這樣做,並從每個塊獲得數據:

my @keys = $data =~ /Keyword1(.*?)Keyword2(.*?)Keyword3(.*?)Keyword4(.*?)\n$/sm; 

然後你可以只刪除每組中的空行。