sub R { printf qq{before: \$_ is '$_'}; printf qq{ \$1 is %s \n}, defined($1) ? qq{'$1'} : 'undefined'; s/(\d+)// ? $1 + R() : 0; printf qq{after: \$_ is '$_'}; printf qq{ \$1 is %s \n}, defined($1) ? qq{'$1'} : 'undefined'; } $_ = 'x55x666x7777x1x'; R(); __END__ before: $_ is 'x55x666x7777x1x' $1 is undefined before: $_ is 'xx666x7777x1x' $1 is '55' before: $_ is 'xxx7777x1x' $1 is '666' before: $_ is 'xxxx1x' $1 is '7777' before: $_ is 'xxxxx' $1 is '1' after: $_ is 'xxxxx' $1 is '1' after: $_ is 'xxxxx' $1 is '1' after: $_ is 'xxxxx' $1 is '1' after: $_ is 'xxxxx' $1 is '1' after: $_ is 'xxxxx' $1 is '1'