#!/usr/bin/perl -- use strict; use warnings; use Data::Dump qw/ dd /; my $line = "k1:v1 k2:v2 k3:v3"; my %pairs; while( $line =~ m{\b([^:\s]+):([^:\s]+)\b}g ){ my( $k, $v ) = ( $1, $2 ); $pairs{$k}=$v; } dd( \%pairs ); if( delete $pairs{'k3'} ){ %pairs = ( k3 => { %pairs } ); } dd( \%pairs ); __END__ { k1 => "v1", k2 => "v2", k3 => "v3" } { k3 => { k1 => "v1", k2 => "v2" } }