my @products; ... if (/^Product\sname:\s(\w.*)/) { push(@products, { name => $1, opts => [] }); } if (/^Option\sName:\s(\w.*)/) { push(@{$products[-1]{opts}}, $1); } ... foreach my $product (@products) { my $name = $product->{name}; my $opts = $product->{opts}; print($name, ': ', join(' ', @$opts), "\n"); }