use XML::Rules; my $parser = XML::Rules->new( stripspaces => 7, rules => { fruit => 'as array', fruits => 'pass no content', 'average-color' => [ 'fruit' => sub {return 'fruit-average-color' => $_[1]->{_content}}, 'fruits' => sub {return 'global-average-color' => $_[1]->{_content}}, sub {}, ] } ); my $data = $parser->parse(\*DATA); use Data::Dumper; print Dumper($data); __DATA__ purple yellow greenish