my %dispatch = ( SCALAR => sub{ return 1; }, ARRAY => sub { my $ref = shift; my $n = scalar(@$ref); for(my $i = 0; $i < $n; ++$i) { my $result = clean($ref->[ $i ]); if($result == 0) { splice(@$ref, $i, 1); $i--; $n--; } } unless(@$ref) { return 0; } }, "HASH" => sub { my $ref = shift; while(my ($key, $value) = each( %$ref)) { my $result = clean($value); if ($result == 0) { delete($ref->{$key}); } } my $n = scalar(keys %$ref); if ($n == 0) { return 0; } return 1; }, REF => sub{ my $ref = shift; die "REF: $ref not allowed"; }, CODE => sub{ my $ref = shift; die "CODE: $ref not allowed"; }, '' => sub{ return 1; }, );