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 } #### sub f { $_=my@v;{$_&&push@v,$_;$_=pop;/=>/||redo} $k=pop;$h{$k}=[@v,@{$h{$k}}];@_?&f:\%h } #### sub f { my@v;{$_=pop;/=>/||(push@v,$_)&&redo} $k=pop;$h{$k}=[@v,@{$h{$k}}];@_?&f:\%h }