You didn't clearly express what you wanted as your final structure, so I hope this helps
my %records;
my $record;
while (<DATA>) {
chomp;
my $line = $_;
s/^(\d\d)//;
my $subrecord_type = $1;
if ($subrecord_type == 10) {
s/^(\d+)\s+//;
my $procedure_num = $1;
$records{$procedure_num} = $record = [];
}
push(@$record, $line);
}
require Data::Dumper;
print(Data::Dumper::Dumper(\%records));
__DATA__
1000001 01.11.199600.00.00001 A1 1 SN Y
2001.11.200400098.0500073.5500083.35
5001.11.1997Professional attendance being an attendance at
5001.11.1997other than consulting rooms, by a general
5001.11.1997practitioner on not more than 1 patient
output
======
$VAR1 = {
'00001' => [
'1000001 01.11.199600.00.00001 A1 1 SN Y',
'2001.11.200400098.0500073.5500083.35',
'5001.11.1997Professional attendance being an a
+ttendance at',
'5001.11.1997other than consulting rooms, by a
+general',
'5001.11.1997practitioner on not more than 1 pa
+tient',
]
};
=== or maybe ===
my %records;
my $record;
while (<DATA>) {
chomp;
my $line = $_;
s/^(\d\d)//;
my $subrecord_type = $1;
if ($subrecord_type == 10) {
s/^(\d+)\s+//;
my $procedure_num = $1;
$records{$procedure_num} = $record = {};
s/^(\d\d\.\d\d\.\d\d\d\d)//;
my $date1 = $1;
s/^(\d\d\.\d\d\.\d\d\d\d)//;
my $date2 = $1;
my (
$unknown1,
$unknown2,
$unknown3,
$unknown4,
$unknown5,
) = split(/\s+/, $_);
%$record = (
date1 => $date1,
date2 => $date2,
unknown1 => $unknown1,
unknown2 => $unknown2,
unknown3 => $unknown3,
unknown4 => $unknown4,
unknown5 => $unknown5,
20 => [],
30 => [],
40 => [],
50 => [],
);
next;
}
if ($subrecord_type == 20) {
s/^(\d\d\.\d\d\.\d\d\d\d)//;
my $date = $1;
my (
$unknown1,
$unknown2,
$unknown3,
$unknown4,
) = split(/\./, $_);
push(@{$record->{20}}, {
date => $date,
unknown1 => $unknown1,
unknown2 => $unknown2,
unknown3 => $unknown3,
unknown4 => $unknown4,
});
next;
}
if ($subrecord_type == 30) {
# ...
next;
}
if ($subrecord_type == 40) {
s/^(\d\d\.\d\d\.\d\d\d\d)//;
my $date = $1;
push(@{$record->{40}}, {
date => $date,
text => $_,
});
next;
}
if ($subrecord_type == 50) {
s/^(\d\d\.\d\d\.\d\d\d\d)//;
my $date = $1;
push(@{$record->{50}}, {
date => $date,
text => $_,
});
next;
}
}
require Data::Dumper;
print(Data::Dumper::Dumper(\%records));
__DATA__
1000001 01.11.199600.00.00001 A1 1 SN Y
2001.11.200400098.0500073.5500083.35
5001.11.1997Professional attendance being an attendance at
5001.11.1997other than consulting rooms, by a general
5001.11.1997practitioner on not more than 1 patient
output
======
$VAR1 = {
'00001' => {
'date1' => '01.11.1996',
'date2' => '00.00.0000',
'unknown1' => '1'
'unknown2' => 'A1',
'unknown3' => '1',
'unknown4' => 'SN',
'unknown5' => 'Y',
'20' => [
{
'date' => '01.11.2004',
'unknown1' => '00098'
'unknown2' => '0500073',
'unknown3' => '5500083',
'unknown4' => '35',
}
],
'30' => [],
'40' => [],
'50' => [
{
'date' => '01.11.1997'
'text' => 'Professional attendance
+being an attendance at',
},
{
'date' => '01.11.1997'
'text' => 'other than consulting ro
+oms, by a general',
},
{
'date' => '01.11.1997'
'text' => 'practitioner on not more
+ than 1 patient',
}
],
}
};
|