in reply to XML understanding

You just want to print the elements of an array. It takes a little digging to get to the array, but you've already done most of that. The only missing bit is casting the array reference to an array. The magic is @{$machine->{file}{filename}}. Here's the result:

use strict; use warnings; use XML::Simple; my $str = <<XML; <config> <server> <name>server1</name> <file> <filename>/etc/named.conf</filename> <filename>/etc/nsswitch.conf</filename> </file> </server> <server> <name>server2</name> <file> <filename>/etc/named.conf</filename> <filename>/etc/nsswitch.conf</filename> <filename>/etc/hosts</filename> </file> </server> </config> XML my $xml = new XML::Simple (KeyAttr=>[]); my $data = $xml->XMLin ($str); foreach my $machine (@{$data->{server}}) { my $name = $machine->{name}; print "$name\n"; print "\t@{$machine->{file}{filename}}\n"; }

Prints:

server1 /etc/named.conf /etc/nsswitch.conf server2 /etc/named.conf /etc/nsswitch.conf /etc/hosts

DWIM is Perl's answer to Gödel