use strict;
use warnings;
use Data::Dumper;
my %records;
local $/ = "\n\n";
while (<DATA>) {
next if !/^(\d+):(.*)/s;
my ($id, $tail) = ($1, $2);
local $/ = "\n";
open my $recIn, '<', \$tail;
while (<$recIn>) {
chomp;
#next if !/(\w+)\s*=\s*(.*)/;
#
#$records{$id}{$1} = $2;
next if !/^\s*?([^=]+)\s*=\s*(.*)/;
my ($key, $value) = ($1, $2);
s/^\s+|\s+$//g for $key, $value;
$records{$id}{$key} = $value;
}
}
print Dumper(\%records);
__DATA__
...
Using the previous data prints:
$VAR1 = {
'1' => {
'Capacity' => '288196762624 (268.4G)',
'WWN' => '06:00:00:00:05:00:00:00:00:00:00:00:00:00
+:00:03',
'Pool' => 'performance',
'Model' => 'STE30065 CLAR300',
'Maximum speed' => '6 Gbps',
'Health details' => '"The component is operating no
+rmally. No action is required."',
'Vendor capacity' => '322122547200 (300.0G)',
'Part number' => '005049273',
'Enclosure' => 'DPE_0',
'Health state' => 'OK (5)',
'Serial number' => '6SJ2C6MV',
'Slot' => '0',
'Type' => 'SAS',
'User capacity' => '236420176896 (220.2G)',
'ID' => 'disk_dpe_0_0',
'Manufacturer' => 'SEAGATE',
'Name' => 'DPE Disk 0',
'Current speed' => '6 Gbps',
'Rotational speed' => '15000 rpm',
'Firmware revision' => 'ES0E'
},
'2' => {
'WWN' => '06:00:00:00:05:00:00:00:01:00:00:00:01:00
+:00:03',
'Pool' => 'performance',
'Capacity' => '288196762624 (268.4G)',
'Slot' => '1',
'Serial number' => '6SJ28QF3',
'Health state' => 'OK (5)',
'Part number' => '005049273',
'Enclosure' => 'DPE_0',
'Model' => 'STE30065 CLAR300',
'Maximum speed' => '6 Gbps',
'Health details' => '"The component is operating no
+rmally. No action is required."',
'Vendor capacity' => '322122547200 (300.0G)',
'ID' => 'disk_dpe_0_1',
'User capacity' => '236420176896 (220.2G)',
'Manufacturer' => 'SEAGATE',
'Type' => 'SAS',
'Rotational speed' => '15000 rpm',
'Firmware revision' => 'ES0E',
'Current speed' => '6 Gbps',
'Name' => 'DPE Disk 1'
}
};
Note that local overrides the variable's value just for the current block so changing $/ inside the main loop doesn't affect while (<DATA>). open my $recIn, '<', \$tail; treats $tail as a file.
Update: Replaced commented out code to fix the single word matches for keys issue caught by tybalt89.
Optimising for fewest key strokes only makes sense transmitting to Pluto or beyond
|