#!/usr/bin/env perl use 5.014; use warnings; my @html = ( '

2.1. Match Literal Text

', '

2.1.1 H3 Heading

', '

2.1.1.1 H4 Heading

', '

2.2. Match Nonprintable Characters

', '

2.3. Match One of Many Characters

', ); my $re = qr{^([1-6. ]+)([^<]+)()$}; for my $i (0 .. $#html) { $html[$i] =~ s{$re}{$1 . ' id="' . lc($3) =~ y/ /_/r . "\"$2$3$4"}e; } say for @html;