I know that I am a week late, but I found a one-line change to your original code that think is worth sharing. Use the function
substr rather than s/// to insert the id. Note that you already have $+{text} from your first match.
use strict;
use warnings;
use Test::More tests=>3;
my @required = (
qq(<h2 id="match_literal_text">)
.qq(2.1. Match Literal Text</h2>\n),
qq(<h2 id="match_nonprintable_characters">)
.qq(2.2. Match Nonprintable Characters</h2>\n),
qq(<h2 id="match_one_of_many_characters">)
.qq(2.3. Match One of Many Characters</h2>\n),
);
my @ol_file_array = (
"<h2>2.1. Match Literal Text</h2>\n",
"<h2>2.2. Match Nonprintable Characters</h2>\n",
"<h2>2.3. Match One of Many Characters</h2>\n",
);
my $regex = qr/
(?<tag>(<\w\d))
(?<closing_bracket>>)
(?<ol_numbers>(\d\.(\d+?)\.))\s
(?<text>(.+))
(?<closing_tag>(\b<\/\w\d>))
/xms;
foreach (@ol_file_array) {
if ($_ =~ m/$regex/g) {
substr($_, 3, 0) = changer( $+{text} );
ok( $_ eq shift(@required), $_ );
}
else {
... # blah blah blah
}
}
sub changer{
(my $id = $_[0]) =~ tr /A-Z /a-z_/;
return qq/ id="$id"/;
}
OUTPUT:
C:\Users\Bill\forums\monks> tony3.pl
1..3
ok 1 - <h2 id="match_literal_text">2.1. Match Literal Text</h2>
#
ok 2 - <h2 id="match_nonprintable_characters">2.2. Match Nonprintable
+Characters</h2>
#
ok 3 - <h2 id="match_one_of_many_characters">2.3. Match One of Many Ch
+aracters</h2>
#