in reply to Veriable Length Array/Hash derived from CSV to populate an XML

It looks like you just need to use some recursion if %hash is of variable structure.

print "<SESSION>\n"; print_hash(\%hash); print "</SESSION>\n"; sub print_hash { my $hashref = shift; my $prefix = (@_ ? shift : '') . ' '; foreach my $key (sort keys %$hashref) { print "$prefix<$key>\n"; if (ref $hashref->{$key}) { print_hash($hashref->{$key}, $prefix); } else { print "$prefix $hashref->{$key}\n" } print "$prefix</$key>\n"; } }

Also, look at package solutions like XML::Simple to do all the xml generation for you.

use XML::Simple; use strict; ... print XMLout(\%hash, RootName => 'SESSION');

Update: Parameter processing updated to avoid warnings.

Replies are listed 'Best First'.
Re^2: Veriable Length Array/Hash derived from CSV to populate an XML
by TheBigAmbulance (Acolyte) on Mar 29, 2011 at 19:22 UTC
    Thank you wind for that answer. When I use your example, I have a couple of errors coming up.
    Use of uninitialized value within @_ in concatenation (.) or string at + ./scripts.pl line 42, <CSVFILE> line 1693. <Alvarion> Use of uninitialized value within @_ in concatenation (.) or string at + ./scripts.pl line 42, <CSVFILE> line 1693. <Nekoma> Use of uninitialized value within @_ in concatenation (.) or string at + ./scripts.pl line 42, <CSVFILE> line 1693.
    Line 42 of the script is
    my $prefix = shift . ' ';
    Line 1693 of my original csv is
    "3550MayvilleSwitch","Sessions\NOC-INT\Towers\Switches","","10.10.18.2 +1"

      Yeah, you were using a slightly older version of my post. Look at the code now.

      Regardless, you really should look into alternative ways of outputting the XML like I already listed, but the function might give you what you want if all you have is nested hashes.