use strict; use warnings; use Data::Dumper; my $var = '<Country><![CDATA[US]]></Country>'; $var = unwrap_cdata($var); print $var."\n"; my $hash = { america => '<Country><![CDATA[US]]></Country>', europe => ['<Country><![CDATA[IT]]></Country>','<Co +untry><![CDATA[UK]]></Country>'], }; 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/<!\[CDATA\[//; $var =~ s/<!\[CDATA\[//; $var =~ s/]]>//; $var =~ s/]]>//; return $var; }
In reply to Search and substitute into data structures by rbi
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |