sub reduce { my ($ref) = @_; if (ref($ref) eq 'REF') { # recurse into references... $$ref = reduce($$ref); } elsif (UNIVERSAL::isa($ref, 'HASH')) { my @keys = keys %$ref; if (scalar (@keys) == 0) { # empty hash becomes an empty string return ''; } elsif (scalar (@keys) == 1 && $keys[0] eq 'content') { $ref = $ref->{$keys[0]}; # 'content'-only becomes the value } else { foreach (keys %$ref) { # recurse into multi-element hashes $ref->{$_} = reduce($ref->{$_}); } } } elsif (UNIVERSAL::isa($ref, 'ARRAY')) { foreach (@$ref) { # recurse into arrays reduce($_); } } return $ref; }