in reply to XML::Simple How to print data in its original position

Set the KeyAttr option for <nonterminal> to the empty list.

See XML::Simple for further details.

Update: quick explanation for my rather terse answer... when elements are repeated, XML::Simple puts them into either a hash or an array. It chooses a hash if it can find an attribute to use as the hash key. By default the attributes id, key and name are used. Perl hashes don't preserve order; Perl arrays do. By setting the key attribute list to the empty list, you force XML::Simple to use arrays.

That having all been said, in my experience for any even vaguely complex tasks, XML::Simple's "simplicity" actually ends up making things much harder. Witness the XML::LibXML solution...

use 5.010; use XML::LibXML 1.94; use PerlX::MethodCallWithBlock; XML::LibXML:: -> load_xml(location => 'myfile.xml') -> findnodes("//nonterminal | //token") -> map { $_->{name} || $_->textContent } -> foreach { say }
perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'