use strict; use warnings; use Data::Dumper; my $var = '<![CDATA[US]]>'; $var = unwrap_cdata($var); print $var."\n"; my $hash = { america => '<![CDATA[US]]>', europe => ['<![CDATA[IT]]>','<![CDATA[UK]]>'], }; print Dumper $hash; $hash = unwrap_cdata($hash); print Dumper $hash; sub unwrap_cdata { my $var = shift(); if (ref($var)) { $var = unwrap_hash($var) if (ref($var) eq 'HASH'); $var = unwrap_array($var) if (ref($var) eq 'ARRAY'); } else { $var = unwrap_scalar($var); } return $var; } sub unwrap_hash { my $href = shift(); foreach my $key (keys %{$href}) { my $hk = $href->{$key}; $hk = unwrap_hash($hk) if (ref($hk) eq 'HASH'); $hk = unwrap_array($hk) if (ref($hk) eq 'ARRAY'); $hk = unwrap_scalar($hk) if (not ref($hk)); $href->{$key} = $hk; } return $href; } sub unwrap_array { my $aref = shift(); my @array; my $i = -1; foreach my $av (@{$aref}) { $av = unwrap_hash($av) if (ref($av) eq 'HASH'); $av = unwrap_array($av) if (ref($av) eq 'ARRAY'); $av = unwrap_scalar($av) if (not ref($av)); push @array,$av; } return \@array; } sub unwrap_scalar { my $var = shift(); $var =~ s///; $var =~ s/]]>//; return $var; }