my $xml = 'your xml...'; my %coords_by_name; while ($xml =~ m{(.*?)}gs ) { my $placemark_snippet = $1; if ( $placemark_snippet =~ m{(.*?)}gs ) { my $name = $1; while ( $placemark_snippet =~ m{(.*?)}gs ) { push @{$coords_by_name{$name}}, $1; } } } use Data::Dumper; print Dumper(\%coords_by_name);