my %data; while () { chomp; if (/^JOB ID=(\S+) DESC='(\S+)'/) { my $id = $1; my $desc = $2; $data{$id} = { desc => $desc, pred => [], }; } else { my ($id, $pred) = (split(/\s+/))[0, 2]; push(@{$data{$id}{pred}}, $pred); } } require Data::Dumper; print(Data::Dumper::Dumper(\%data)); __DATA__ JOB ID=EX1J DESC='JOB1' JOB ID=EX2J DESC='JOB2' JOB ID=EX3J DESC='JOB3' JOB ID=EX4J DESC='JOB3' EX4J PRED EX2J EX3J PRED EX1J EX4J PRED EX1J