The match expression can be * a scalar * a regular expression * a code reference * undef When the match expression is a code ref it will be passed each element in the data structure in turn and should return true or false. my $iter = diter $data, sub { my $v = shift; defined $v && !ref $v && $v % 2 == 1; }; while ( defined ( my $path = $iter->() ) ) { print "$path\n"; } Note that the match code will see all of the elements in the data structure - not just the scalars. If the match expression is undef it will match those elements whose value is also undef.