I tried this on two implementations of Perl 5.12 and did not come across this problem. 5.8.
Since you have g options, perl tries to match the pattern until it works. See Debug Output below.
Therefore, it does not work in Perl 5.8, but it does:
my $c1; $string =~ s/^(\t*)/$c1=$1;''/ge;
That way, every time it matches, it saves it $c1 .
This is what use re 'debug' says:
Compiling REx `^(\t*)' size 9 Got 76 bytes for offset annotations. first at 2 1: BOL(2) 2: OPEN1(4) 4: STAR(7) 5: EXACT <\t>(0) 7: CLOSE1(9) 9: END(0) anchored(BOL) minlen 0 Offsets: [9] 1[1] 2[1] 0[0] 5[1] 3[1] 0[0] 6[1] 0[0] 7[0] Compiling REx `^(\t*)([^\t]+)' size 25 Got 204 bytes for offset annotations. first at 2 1: BOL(2) 2: OPEN1(4) 4: STAR(7) 5: EXACTF <\t>(0) 7: CLOSE1(9) 9: OPEN2(11) 11: PLUS(23) 12: ANYOF[\0-\10\12-\377{unicode_all}](0) 23: CLOSE2(25) 25: END(0) anchored(BOL) minlen 1 Offsets: [25] 1[1] 2[1] 0[0] 5[1] 3[1] 0[0] 6[1] 0[0] 7[1] 0[0] 13[1] 8[5] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 0[0] 14[1] 0[0] 15[0] String: > Entry< Matching REx `^(\t*)' against ` Entry' Setting an EVAL scope, savestack=5 0 <> < Entry> | 1: BOL 0 <> < Entry> | 2: OPEN1 0 <> < Entry> | 4: STAR EXACT <\t> can match 3 times out of 2147483647... Setting an EVAL scope, savestack=5 3 < > <Entry> | 7: CLOSE1 3 < > <Entry> | 9: END Match successful! match pos=0 Use of uninitialized value in substitution iterator at - line 11. Matching REx `^(\t*)' against `Entry' Setting an EVAL scope, savestack=5 3 < > <Entry> | 1: BOL failed... Match failed Freeing REx: `"^(\\t*)"' Freeing REx: `"^(\\t*)([^\\t]+)"'
Since you are trying to match spaces at the beginning of a line, you do not need either g or i . So this may be the case when you are trying to do something else.
Axeman
source share