Если я что-то упустил, это выглядит довольно просто:
- Вы ищете строку, которая начинается с
Comment
. Это будет содержать ваш идентификатор.
- Когда у вас есть идентификатор, у вас будет строка попытки, за которой следует строка примечания. Прочитайте попытку и строку после которой будет содержать примечание.
- Когда вы переходите к следующему комментарию, вы промываете и повторяете.
У нас есть особая структура: каждый идентификатор будет иметь массив попыток . Каждая попытка будет содержать результат и примечание .
Я собираюсь использовать объектно-ориентированный Perl здесь. Я помещу все идентификаторы записи в список , называемый @dataList
, каждый элемент в этом списке имеет тип Id
.
Каждый тип Id
будет состоять из массива Попыток , а каждая Попытка будет иметь Id , Время , Результат и Примечание .
#! /usr/bin/perl
# test.pl
use strict;
use warnings;
use feature qw(say);
########################################################################
# READ IN AND PARSE YOUR DATA
#
my @dataList;
my $record;
while (my $line = <DATA>) {
chomp $line;
if ($line =~ /^Comment for the record "(.*)"/) {
my $id = $1;
$record = Id->new($id);
push @dataList, $record;
}
elsif ($line =~ /^(\S+)\s+made on\s(\S+)\soutcome\s(.*)/) {
my $attemptId = $1;
my $time = $2;
my $outcome = $3;
# Next line is the note
chomp (my $note = <DATA>);
my $attempt = Attempt->new($attemptId, $time, $outcome, $note);
$record->PushAttempt($attempt);
}
}
foreach my $id (@dataList) {
foreach my $attempt ($id->Attempt) {
print $id->Id . "\t";
print $attempt->Id . "\t";
print $attempt->Note . "\t";
print $attempt->Outcome . "\n";
}
}
#
########################################################################
########################################################################
# PACKAGE Id;
#
package Id;
use Carp;
sub new {
my $class = shift;
my $id = shift;
my $self = {};
bless $self, $class;
$self->Id($id);
return $self;
}
sub Id {
my $self = shift;
my $id = shift;
if (defined $id) {
$self->{ID} = $id;
}
return $self->{ID};
}
sub PushAttempt {
my $self = shift;
my $attempt = shift;
if (not defined $attempt) {
croak qq(Missing Attempt in call to Id->PushAttempt);
}
if (not exists ${$self}{ATTEMPT}) {
$self->{ATTEMPT} = [];
}
push @{$self->{ATTEMPT}}, $attempt;
return $attempt;
}
sub PopAttempt {
my $self = shift;
return pop @{$self->{ATTEMPT}};
}
sub Attempt {
my $self = shift;
return @{$self->{ATTEMPT}};
}
#
########################################################################
########################################################################
# PACKAGE Attempt
#
package Attempt;
sub new {
my $class = shift;
my $id = shift;
my $time = shift;
my $note = shift;
my $outcome = shift;
my $self = {};
bless $self, $class;
$self->Id($id);
$self->Time($time);
$self->Note($note);
$self->Outcome($outcome);
return $self;
}
sub Id {
my $self = shift;
my $id = shift;
if (defined $id) {
$self->{ID} = $id;
}
return $self->{ID};
}
sub Time {
my $self = shift;
my $time = shift;
if (defined $time) {
$self->{TIME} = $time;
}
return $self->{TIME};
}
sub Note {
my $self = shift;
my $note = shift;
if (defined $note) {
$self->{NOTE} = $note;
}
return $self->{NOTE};
}
sub Outcome {
my $self = shift;
my $outcome = shift;
if (defined $outcome) {
$self->{OUTCOME} = $outcome;
}
return $self->{OUTCOME};
}
#
########################################################################
package main;
__DATA__
Comment for the record "id1"
Attempt1 made on [time] outcome [outcome11]
note 11
Comment for the record "id2"
Attempt21 made on [time] outcome [outcome21]
note 21
Attempt22 made on [time] outcome [outcome22]
note 22
Comment for the record "id3"
Attempt31 made on [time] outcome [outcome31]
note 31
Attempt32 made on [time] outcome [outcome32]
note 32
Attempt33 made on [time] outcome [outcome33]
note 33
Attempt34 made on [time] outcome [outcome34]
note 34