当块空白行结束时,如何读取带/不带空行的块?

时间:2010-11-15 09:51:04

标签: perl parsing text-parsing

我的文本文件中有一些块。我假设通过下面的块来构建我的文本 如何通过关键字读取块。(keyword1,keyword2,keyword3,keyword4)。

我有两个问题 1.有没有方法可以有效地获取每个关键字的下一行?
2.我不知道如何跳转keyword3和keyword4之间的内部空白行。关键点是块定义的结束空白。

**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**

3 个答案:

答案 0 :(得分:1)

您是否知道将$/设置为“段落模式”的空字符串?

现在,对<>readline的每次通话都会返回一条多行记录,最多只能删除一行或多行。chomp会从最后删除它们。

答案 1 :(得分: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

答案 2 :(得分:1)

你不能只做一个多线匹配并使用关键字作为这样的锚:

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

实际上,您也可以这样做,并从每个块获取数据:

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

然后你可以在每组中删除空白行。