http://www.perlmonks.org?node_id=999630


in reply to finding ancestor elements related to specific change

I'd strongly suggest dropping XML::Simple and using a DOM-based XML library. These tend to have useful methods called things like parentNode.

use XML::LibXML 1.70; my $xml = XML::LibXML->load_xml(string => <<'END'); <classes name="Panoply::BAR"> <public_methods> <members name="BAR" const="no" kind="function" protection="publ +ic" static="no" virtualness="non_virtual" volatile="no"> <parameters declaration_name="pciReg" type="Register::Ptr" /> </members> <members name="bits" const="no" kind="function" protection="pub +lic" static="no" type="void" virtualness="non_virtual" volatile="no"> <parameters declaration_name="value" type="uint64_t" /> </members> <members name="subBitVector" const="no" kind="function" protect +ion="public" static="no" type="void" virtualness="non_virtual" volati +le="no"> <parameters declaration_name="value" type="const BitVector &a +mp;" /> </members> </public_methods> <enums> <members name="ObjectState" kind="enum" protection="public" sta +tic="no" virtualness="non_virtual"> <values name="NEW"> </values> <values name="REFRESHED"> </values> <values name="DIRTY"> </values> </members> </enums> </classes> END my @results = $xml->findnodes('//*[@declaration_name="value"]'); foreach my $result (@results) { print "Got result, with parent: ", $result->parentNode->getAttribu +te('name'), "\n"; }
perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'