#! 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; #### { "01:00:00,00" => { Budget => { cost => 44_444, tax => "11%", total => 3343 }, Col => "Foo", Color => "y", Description => "Scene", International => "y", Link => "y", Sound => "Dolby", }, "02:00:00,00" => { Budget => { cost => 54_444, tax => "1%", total => 1343 }, Col => "Boo", Color => "n", Description => "Scene", International => "y", Link => "y", Sound => "THX", }, "03:00:00,00" => { Budget => { cost => 64_444, tax => "1%", total => 2343 }, Col => "Goo", Color => "y", Description => "Scene", International => "y", Link => "n", Sound => "PTX", }, "04:00:00,00" => { Budget => { cost => 84_444, tax => "1.1%", total => 5343 }, Col => "Aoo", Color => "n", Description => "Scene", International => "y", Link => "y", Sound => "DDY", }, }