#!/usr/bin/perl
use strict; # https://perlmonks.org/?node_id=11112988
use warnings;
my $wiki =
'_/one *two*/ th/ree_ null _/four *five*/ six_ null _/se_ven *eig
+ht*/ nine_';
my $expected =
'<u><i>one <b>two</b></i> th/ree</u> null <u><i>four <b>five</b></
+i> six</u> null <u><i>se_ven <b>eight</b></i> nine</u>';
my %h = (
'*' => 'b' ,
'/' => 'i' ,
'_' => 'u' ,
);
my $html = $wiki =~ s{ (?:^|\s) \K ([*_/]+) | ([*_/]*) (?=$|\s) }
{ $1 ? $1 =~ s|.|<$h{$&}>|gr : $2 =~ s|.|</$h{$&}>|gr }gexr;
print $html eq $expected ? "passed" : "FAILED", "\n\n";
print $wiki, "\n\n", $expected, "\n\n", $html, "\n";
Outputs;
passed
_/one *two*/ th/ree_ null _/four *five*/ six_ null _/se_ven *eight*/
+nine_
<u><i>one <b>two</b></i> th/ree</u> null <u><i>four <b>five</b></i> si
+x</u> null <u><i>se_ven <b>eight</b></i> nine</u>
<u><i>one <b>two</b></i> th/ree</u> null <u><i>four <b>five</b></i> si
+x</u> null <u><i>se_ven <b>eight</b></i> nine</u>