#!/usr/bin/env perl use strict; use warnings; use Data::Dump; my (%data, $topkey); while () { chomp; $data{$topkey}{$1} = $2 and next if /^(.*?)=(.*?)$/; $topkey = $_; } dd \%data; __DATA__ Paragraph1 key1=valueA Paragraph2 key2=valueB key3=valueC Paragraph3 #### { Paragraph1 => { key1 => "valueA" }, Paragraph2 => { key2 => "valueB", key3 => "valueC" }, }