use XML::SAXDriver::CSV; my $code_handler= new code_handler; our $DATA = <<"CSV"; field1, field2, field3 F1_1, F1_2, F1_3 F2_1, F2_2, F2_3 F3_1,, F3_3 ,, F4_3 ,, F6_1 F7_1,, ,F8_2, CSV my $driver = XML::SAXDriver::CSV->new(Source => {String => $main::DATA}, Handler => $code_handler, Dynamic_Col_Headings => 1, IndentChar => ' ', File_Tag => 'code'); $driver->parse(); package code_handler; sub new { my $class= ref $_[0] || $_[0]; return bless {}, $class; } sub start_document { my $code_handler= shift; my $document= shift; } sub end_document { my $code_handler= shift; my $document= shift; } sub start_element { my $code_handler= shift; my $element= shift; my $name= $element->{Name}; my $atts= $element->{Attributes}; print "<$name"; foreach my $att (sort keys %$atts) {print " $att='$atts->{$att}'";} print ">"; } sub characters { my $code_handler= shift; my $character= shift; print $character->{Data} if( defined $character->{Data}); } sub end_element { my $code_handler= shift; my $element= shift; my $name= $element->{Name}; print ""; }