in reply to Search and substitute into data structures

You could use recursion to simplify that a bit:
sub unwrap_cdata { my @array; for ( @_ ) { if ( ref ) { push @array, ref eq 'ARRAY' ? [ unwrap_cdata( @$_ ) ] : ref eq 'HASH' ? { unwrap_cdata( %$_ ) } : ref eq 'SCALAR' ? \unwrap_cdata( $$_ ) : (); } else { ( my $var = $_ ) =~ s/<!\[CDATA\[//; $var =~ s/&lt;!\[CDATA\[//; $var =~ s/]]>//; $var =~ s/]]&gt;//; push @array, $var; } } return wantarray ? @array : $array[ 0 ]; }