I'd use Tie::File and set the record separator. Then use some multiline regexes. I tested your data out on the following code, and it worked like a charm.
use strict;
use warnings;
use Tie::File;
my ($record, @array, %data) = (0);
my $file = 'whatever';
tie @array, 'Tie::File', $file, recsep => '=' x 30 . "\n";
while ($array[$record]) {
$record++, next unless $array[$record] =~ m/^[^=]/;
@{$data{$record}}{'primary', 'level', 'group', 'id_node',
'inverse', 'secondaries'} =
$array[$record] =~ m/# get primary id, level, and group
Primary[^:]+ \D+(\d+) \D+(\d+) \D+(\d+)
# then the id-node and inverse
(?:[^:]+:){4} \D+(\w+) \D+(\d+)
# skip 'Secondary ID' line
[^K]+
# and grab the rest until end of record
([^=]+)
/gxms;
$record++;
}
for my $rec (keys %data) {
for (keys %{$data{$rec}} ) {
print $_ . ' is set to ' . $data{$rec}{$_} . "\n";
}
}