sub deep_search { my $target = shift; my $test = shift; # Avoid infinite loops by maintaining map of objects encountered local %SearchCache = ( undef => undef ) unless ( exists $SearchCache +{undef} ); return if ( $SearchCache{ $target } ++ ); # Determine data type of unblessed reference or blessed object my $ref = ref( $target ); if ( "$target" =~ /^\Q$ref\E\=([A-Z]+)\(0x[0-9a-f]+\)$/ ) { $ref = $ +1 } ( $test->( $target ) ? $target : () ), ( map { deep_search($_, $test) } grep { ref($_) } ( ($ref eq 'HASH') ? values %$target : ($ref eq 'ARRAY') ? @$target : ($ref eq 'REF' or $ref eq 'SCALAR') ? $$target : () ) ) } my $struct = { foo => bless( [ 0, 1, 2 ], 'Foo' ), bar => bless( [ 3, 4, 5 ], 'Bar' ), foozles => [ { foolish => bless( [ 6, 7, 8 ], 'Foo' ), } ], }; print join '', map "$_\n", deep_search( $struct, sub { ref( $_[0] ) eq + 'Foo' } )
In reply to Re: searching for an object reference
by simonm
in thread searching for an object reference
by Anonymous Monk
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |