use warnings; use strict; use XML::LibXML; my $xml = <<'EOT'; EOT my $topo_initial = "ABCDEFGHIJK"; my $side1 = "x"; my %opposite = ( x => "?" ); my $dom = XML::LibXML->load_xml(string => $xml); for my $node ($dom->findnodes('//REGION')) { my $offset = $node->{seq_beg} - 1; my $length = $node->{seq_end} - $node->{seq_beg} + 1; if ( $node->{type}==1 ) { substr($topo_initial, $offset, $length, ($side1 x $length) ); } elsif ( $node->{type}==2 ) { substr($topo_initial, $offset, $length, ($opposite{$side1} x $length) ); } else { substr($topo_initial, $offset, $length, ('U' x $length) ); } } use Test::More tests=>1; is $topo_initial, "xxxD???HUUU";