#!/usr/bin/perl use strict; use warnings; use XML::Parser; use Data::Dumper; my $string = qq~ 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 ~; my $matrix=[]; my $ref_row; my $ref_col; my $parser = XML::Parser->new(Handlers => { Start => sub{ my $parser=shift; my $name=shift; my $opts={@_}; if($name eq 'row') { $ref_row=[]; $matrix->[$opts->{no}]=$ref_row; $ref_col=undef; } elsif($name eq 'col' && $ref_row) { $ref_col=\$ref_row->[$opts->{no}]; } }, Char => sub{ my $parser=shift; my $string=shift; if($ref_col) { $$ref_col=$string; $ref_col=undef; } }}); $parser->parse($string); print Dumper($matrix);