use Data::Dumper; my $h = f(qw[ foo => zoo moo too bar => car far bar => zar tar qux => mux ]); print Dumper $h; sub f { $_='';my@v;{$_&&push@v,$_;$_=pop;redo until/=>/} $k=pop;$h{$k}=[@v,@{$h{$k}}];@_?&f:\%h }