我的文本文件中有一些块。我假设通过下面的块来构建我的文本
如何通过关键字读取块。(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**
答案 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;
然后你可以在每组中删除空白行。