Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: Re: Re: Type checker not checking out

by clemburg (Curate)
on Aug 06, 2001 at 13:15 UTC ( [id://102414]=note: print w/replies, xml ) Need Help??


in reply to Re: Re: Type checker not checking out
in thread Type checker not checking out

Easy. Change map_recursive() to not descend into recognized structures. That is probably the more sensible default behavior, agreed.

#!/usr/bin/perl -w use strict; sub map_recursive { my ($structure, $predicate) = @_; # don't descend into recognized structures if ($predicate->($structure)) { return $predicate->($structure); } # not recognized - pick apart my @result; if (UNIVERSAL::isa($structure, 'ARRAY')) { for (@{$structure}) { push @result, map_recursive($_, $predicate); } } elsif (UNIVERSAL::isa($structure, 'HASH')) { for (keys %{$structure}) { push @result, map_recursive($structure->{$_}, $predicate); } } else { push @result, $predicate->($structure); } return @result; } package Foo; sub new { bless {}, shift } sub get { $_[0]->{$_[1]} } sub set { $_[0]->{$_[1]} = $_[2] } package main; my @list = (Foo->new, Foo->new, Foo->new); $list[0]->set('a', 'b'); $list[1]->set('b', 'a'); $list[2]->set('x', 'y'); my $isa_foo = sub { UNIVERSAL::isa(shift, 'Foo') }; print "#1: ", join(',', map_recursive(\@list, $isa_foo)), "\n"; my @list2 = ( {a => 'm'}, { 1 => 55}, { Foo => 'Bar' }); my $h = sub { UNIVERSAL::isa(shift, 'HASH') }; print "#2: ", join(',', map_recursive (\@list2, $h)), "\n";

Christian Lemburg
Brainbench MVP for Perl
http://www.brainbench.com

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://102414]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others pondering the Monastery: (6)
As of 2024-04-19 13:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found