in reply to searching for an object reference
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' } )
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: searching for an object reference
by Mostly Harmless (Initiate) on Jul 06, 2005 at 08:08 UTC | |
by simonm (Vicar) on Jul 08, 2005 at 23:52 UTC | |
by simonm (Vicar) on Jul 09, 2005 at 00:24 UTC | |
|
Re^2: searching for an object reference
by pemungkah (Priest) on Jul 06, 2005 at 01:20 UTC | |
by Mostly Harmless (Initiate) on Jul 06, 2005 at 07:38 UTC |