in reply to Store last value of for loop

It is actually potentially more difficult than that. If you're actually using threads, then one iteration should start before the other finishes.

What you need to do is use threads::shared then share $i across threads. That way no matter what thread updates it, the others will see the update. With one caveat. There might be a possible race condition where 2 threads try to ++ at the same time and you create a problem internally. This should be rare, but to be safe you should lock. So that looks something like this:

use strict; use threads; use threads::shared; my $i :shared; $i = 1; # Time and code passes. for my $id (@article_id) { lock($i); print "$i\n"; $i++; } # More code.
Note that if you want to put long-running code in that loop you will lose the benefits of threading because different threads will block on the lock on $i. If you want to solve that you can do this:
use strict; use threads; use threads::shared; { my $i :shared; sub get_i { lock($i); return ++$i; } } # Time and code passes. for my $id (@article_id) { my $i = get_i(); print "$i\n"; # Do lengthy processing. } # More code.

Update: johngg pointed out that the modules were named threads but my code called them thread instead. Fixed.