my ($key, $value, $len); while (($key, $value) = each %HoL) { my $href = $HoL{$key} = { map {$_, 1} @$value }; do { $len = keys %$href; for (@HoL{@$value}) { if (ref eq "HASH" ) { @$href{keys %$_} = (1) x (keys %$_) } elsif (ref eq "ARRAY") { @$href{@$_} = (1) x @$_ } } $value = [ keys %$href ]; } while (@$value > $len); }