my $data="fruit=pear meat=chicken legs fruit=orange slices cheese=monterey jack meal=lunch meat=ribs bread= "; my %foo; while ($data =~ m/(\S+)=(\S*($|([^=]+\s+)*))/g) { my ($tmpkey,$tmpval); my $count=1; $tmpkey=$1; $tmpval=$2; while (defined $foo{$tmpkey}){ $count++; $tmpkey=~s/\_\d+$//; $tmpkey.="_$count"; } $foo{$tmpkey}=$tmpval; } for (sort (keys %foo)){ if ($_!~/_\d+/){ my $rm=$_; $_.="_1"; $foo{$_}=$foo{$rm}; delete $foo{$rm}; } chomp ($_,$foo{$_}); print "$_->$foo{$_}\n"; }