#! perl -slw use strict; use Data::Dump qw[ pp ]; my %data; while( ) { chomp; m{^ (.+) :: \s+ (.+) \s+ -- \s+ (.+) \s+ \[ (.+) \] \s* }x or warn "Mismatch: '$_'" and next; $data{ $1 } = { split( ' ', $2 ), split( ' ', $3 ), map { split '=', $_, 2 } split ',\s?', $4 }; $data{ $1 }{ Budget } = { map{ split '=' } split ';', $data{ $1 }{ Budget } }; } pp \%data;