Как прочитать блок с / без пустой строки, когда блок заканчивается пустой строкой? - PullRequest
0 голосов
/ 15 ноября 2010

В моем текстовом файле есть несколько блоков.Я предполагал структурировать свой текст по блоку ниже
Как я могу прочитать блок по ключевым словам (ключевое слово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**

Ответы [ 3 ]

1 голос
/ 15 ноября 2010

Если я понимаю ваши данные, пустые строки не являются надежным индикатором, поскольку они могут появляться до того, как начинается текст ключевого слова, после текста или вообще не показываться.Если это так, я не думаю, что это поможет прочитать текст в «режиме абзаца» (установив $/ в пустую строку).Точно так же, пустые строки не помогают - по крайней мере, не простым способом - определить начало и конец разделов ключевых слов или «блоков».

Вам придется проанализировать текстболее детально, но вы не дали нам достаточно информации, чтобы дать подробный ответ.Вот пример, который просто хранит непустые строки по ключевому слову:

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
1 голос
/ 16 ноября 2010

Разве вы не можете просто выполнить многострочное сопоставление и использовать ключевые слова в качестве якорей, как это:

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

На самом деле, вы можете сделать это и получить данные из каждого блока:

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

и тогда вы можете просто удалить пустые строки в каждой группе.

1 голос
/ 15 ноября 2010

Знаете ли вы о настройке $/ в пустую строку для «режима абзацев»?

Каждый вызов <> или readline теперь возвращает многострочную запись до одной или нескольких пустых строк, а chomp удаляет их все с конца.

...