Thanks. I ended up writing a Data::ObjSearch yes'day. However, your's look simpler. I didn't know about 'REF' and didn't handle it. Otherwise it looks similar:
package Data::ObjSearch; use strict; use Carp; sub new { my ($class, $sub) = @_; my $self = bless({}, $class); if (ref($sub) eq 'CODE') { $self->{sub} = $sub; } elsif ($sub and !ref($sub)) { $self->{sub} = sub { return UNIVERSAL::isa($_[0], $sub); }; } else { croak "Pass a subroutine reference or package name.\n"; } $self->{records} = []; $self->{seen} = {}; return $self; } sub search { my ($class, $ref, $sub) = @_; my $self = ref($class) ? $class : $class->new($sub); $self->analyze($ref); return @{$self->{records}}; } sub analyze { my ($self, $data) = @_; my $ref = ref($data); return if (!$ref); my ($pack, $type, $id) = $data =~ /^(?:(.*)\=)?([^=]*)\(([^\(]*)\)$/ +; return if ($id && $self->{seen}->{$id}); $pack && ($self->check_and_push($data), $ref = $type); $id && ($self->{seen}->{$id} = 1); if ($ref eq 'HASH') { while (my ($key, $val) = each %{$data}) { $self->analyze($val); +} } elsif ($ref eq 'ARRAY') { map { $self->analyze($_) } @$data; } elsif ($ref eq 'SCALAR') { map { $self->analyze($_) } $$data; } } sub check_and_push { my ($self, $data) = @_; push(@{$self->{records}}, $data) if $self->{sub}->($data); } 1;
I was thinking of uploading it to CPAN to avoid maintaining too generic code with our application codebase.

In reply to Re^2: searching for an object reference by Mostly Harmless
in thread searching for an object reference by Anonymous Monk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.