jccunning has asked for the wisdom of the Perl Monks concerning the following question:
#!/usr/bin/perl use feature ":5.14"; use warnings FATAL => qw(all); use strict; use Data::Dump qw(dump pp); use XML::Simple; my @list; my $x = XMLin(<<'END', KeyAttr=>['declaration_name', 'name']); <classes name="Panoply::BAR"> <public_methods> <members name="BAR" const="no" kind="function" protection="publi +c" static="no" virtualness="non_virtual" volatile="no"> <parameters declaration_name="pciReg" type="Register::Ptr" /> </members> </public_methods> <enums> <members name="ObjectState" kind="enum" protection="public" stat +ic="no" virtualness="non_virtual"> <values name="NEW"> </values> <values name="REFRESHED"> </values> <values name="DIRTY"> </values> </members> </enums> </classes> END sub r($$$;$); sub r($$$;$) {my ($r, $l, $e, $a) = @_; $a = [] unless $a; return unless $l and ref($l); if (ref($l) =~ /HASH/) {for(sort keys %$l) {unless (/$e/) {push @$a, $_; r($r, $l->{$_}, $e, $a); pop @$a; } else {&$r(@$a); } } } elsif (ref($l) =~ /ARRAY/) {for(1..@$l) {unless ($l->[$_-1] =~ /$e/) {push @$a, $_; r($r, $l->[$_-1], $e, $a); pop @$a; } else {&$r(@$a); } } } } # r sub {push (@list, join(" => ", @_))}, $x, "parameters"; r sub {push (@list, join(" => ", @_))}, $x, "pciReg"; # r sub {push (@list, join(" => ", @_))}, $x, "DIRTY"; my $elist = join("\n", @list); print "$elist\n";
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: sub that finds ancestor elements
by GrandFather (Saint) on Sep 13, 2012 at 02:06 UTC | |
|
Re: sub that finds ancestor elements
by tobyink (Canon) on Sep 13, 2012 at 02:00 UTC | |
by tobyink (Canon) on Sep 13, 2012 at 20:52 UTC | |
by jccunning (Acolyte) on Sep 13, 2012 at 21:47 UTC | |
by tobyink (Canon) on Sep 14, 2012 at 05:45 UTC | |
by jccunning (Acolyte) on Sep 13, 2012 at 19:23 UTC |