First let me explain why your solution doesn't work as expected:
s///g starts each match where the previous match left off, or at the start of the string for the first match.
The first match finds 1 2, and the next match searches for a \d, which is the 3 -- no overlap occurs.
A possible fix is to not match the second digit:
s/(\d)\s+/$1;/g;
Which produces the output you want. If it's important that no substitution happens after a number but before a letter, you can use
s/(\d)\s+(?=\d)/$1;/g;
The (?=\d) looks for a digit, but it doesn't consume it (search for look-ahead in perlre).
Update: Kudos for supplying your code, actual output and expected output. It makes answering your question easy, and can't be taken for granted. Welcome to perlmonks!
In reply to Re: Beginner question about search and replace
by moritz
in thread Beginner question about search and replace
by hilbert
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |