#!/usr/bin/perl use strict; use warnings; use XML::Simple; my $file_add='test.txt'; my $file_xml='text.xml'; my @blocks=parse_file($file_add); my $xml=XMLin($file_xml); # hier das "items" passend ersetzen my $data_add=$xml->{items}->{'find-spot'}; for my $pos (0..$#blocks) { my $data_val=$blocks[$pos]; next unless($data_val); if(ref($data_add) eq 'ARRAY') { next unless($data_add->[$pos]); $data_add=$data_add->[$pos]; } if(exists($data_add->{environment})) { if(ref($data_add->{environment}) eq 'ARRAY') { push(@{$data_add->{environment}},@$data_val) } else { $data_add->{environment}=[$data_add->{environment},@$data_val]; } } else { $data_add->{environment}=\@$data_val; } } print XMLout($xml); ######################################################################## sub parse_file { my $file=shift; my @blocks=(); local $/='______________'; open(my $fh, '<', $file) or die("ERROR open $file ($!)\n"); while(my $block=<$fh>) { my @data=(); my $id=@blocks; for my $line (split("[\r\n]+",$block)) { next unless($line); if($line=/^\s*Block\s*(\d+):/) { $id=$1; next; } push(@data,$line); } $blocks[$id]=\@data; } close($fh); return @blocks; }