http://www.perlmonks.org?node_id=1014476


in reply to foreach-loop-local var in sub

Defining a named sub in a loop is not doing what you think. The sub is defined just once, using the $i of the first iteration. On the next iteration, a new $i is created by my, but the sub is not redefined and still references the previous $i. It is better to use parameters to pass values to subroutines.

If you remove my (and, under strict, replace it with our), the intended behaviour will occur, using a global variable.

لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

Replies are listed 'Best First'.
Re^2: foreach-loop-local var in sub
by warshall (Novice) on Jan 21, 2013 at 16:09 UTC
    Thank you. this answered my question. I didn't know about "our" (and still don't, but at least now I know what I should be looking for). -warshall

      I didn't know about "our" (and still don't, but at least now I know what I should be looking for)
      Nooo!!! You should not be looking at our! Lexical variables (my) are what you should be learning about first and they should be preferred to global variables (our) in almost all cases.

      Given you are a Perl beginner, you need to master the basics of scoping and how to write subroutines. Start by defining all your subroutines at the top of the file and pass parameters to each subroutine. Do not succumb to the evil of having subroutines use global variables. Instead think about your code, what each subroutine does and what it needs, and pass parameters to each subroutine for use as local variables within the subroutine. For example:

      use strict; use warnings; sub my_print { my $i = shift; print $i; } foreach my $j (0, 1) { my_print($j); }

      Further reading from the Perl monks Tutorials section:

      As for learning Perl, take a look at learn.perl.org and Perl Tutorial Hub. Also, be sure to refer to the Perl online documentation. Good luck!

      what I should be looking for
      I would recommend looking for subroutine parameters, rather. See perlsub for details.
      لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

      I think you are searching for anonymous subroutines and closures, but given that you indeed seem like a programming/Perl newbie, you shouldn't be venturing there and instead heed to the advice given in 1014512 above.