Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re: foreach-loop-local var in sub

by choroba (Abbot)
on Jan 21, 2013 at 16:02 UTC ( #1014476=note: print w/ replies, xml ) Need Help??


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.

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


Comment on Re: foreach-loop-local var in sub
Select or Download Code
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
      what I should be looking for
      I would recommend looking for subroutine parameters, rather. See perlsub for details.
      لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

      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!

      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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1014476]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others cooling their heels in the Monastery: (6)
As of 2014-08-30 18:40 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (293 votes), past polls