use strict; my $inputfile = $ARGV[0]; open (IN,"$inputfile") || die ("Can't open the input file for reading"); undef $/; my $str = ; while($str =~ /(?:(?:(?!<\/list-bull>).)*)<\/list-\1>/sgi) { $str =~ s#(?:(?:(?!<\/list-bull>).)*)<\/list-\1>#&List_find($&)#sgie; } sub List_find { my $line = @_[0]; my $currentlevel = 0; while($line =~ /^[\s\S]*?<(P_list-(\w+)\((\d+)\))>(.*?)<\/\1>\s*/si) { my ($tag, $kind, $level, $text) = ($1, $2, $3, $4); if ($currentlevel < $level) { while($currentlevel < $level) { $line = "\n\n

"; $currentlevel++; } } elsif ($currentlevel > $level) { while($currentlevel > $level) { $currentlevel--; $line ="

\n
\n"; } $line = "

\n

"; } else { $line = "

\n

"; } $line .= $text; # print $line; } while($currentlevel > 0) { $currentlevel--; $line .= "

\n\n"; } #print $line; return "$line"; } open (OUT,">$inputfile\.xml") || die ("Can't open the output file for writing"); print OUT $str; close (OUT);