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'