in reply to Beginner question about search and replace

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!

Replies are listed 'Best First'.
Re^2: Beginner question about search and replace
by hilbert (Acolyte) on Sep 16, 2011 at 11:47 UTC
    Thanks a lot for your absolutely clear explanation and solution.
Re^2: Beginner question about search and replace
by Anonymous Monk on Sep 16, 2011 at 17:36 UTC
    You may also wish to note that if you're reading the data from a file and don't chomp the trailing newline, the two versions will produce different results.

    The first form will result in a trailing ';' because newline is part of the whitespace character class. (\s)

    -Greg