in reply to Re: Looping on a match, and value of $1
in thread Looping on a match, and value of $1

Think it is just a typo or the expression was not precise, this left me wondering: The last iteration of the expression left $1 set to "5"

His original code has two seperate perl -e, so this does not really fit, as the two for loops are not related at all. Even if there is only one perl -e, $1 still will be reset when the second // is executed.

But I believe diotalevi made the point (precisely in his mind). The whole point is that, the // is not executed for each iteration, but once at the begin. The for loop does not loop through the //, but rather the array produced by //. $_ always takes the current value of the current element when it loops, but $1 has nothing to do with the loop, and its value stays.

Thought just add a bit code to back up what he said (there will never be any harm to do a little bit experiment):

use strict; use warnings; my $t; #comment out one of the next two lines #$a="1b2cde5";for($a=~/(\d+)/g){display($_, $1); $t+=$1;};print "$t\n" +; $a="1b2cde5";for($a=~/(\d+)/g){display($_, $1); $t+=$_;};print "$t\n"; sub display { print "_ = " . shift() . ", 1 = " . shift() . "\n"; }

Comment out the first one, you get:

_ = 1, 1 = 5 _ = 2, 1 = 5 _ = 5, 1 = 5 8

Comment out the second one, you get:

_ = 1, 1 = 5 _ = 2, 1 = 5 _ = 5, 1 = 5 15