Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re: The error says the value is uninitialized, but it works anyway

by BillKSmith (Prior)
on Aug 17, 2019 at 13:14 UTC ( #11104616=note: print w/replies, xml ) Need Help??


in reply to The error says the value is uninitialized, but it works anyway

haukex has explained your indexing problem. You can fix it by processing the array backwards. No other change to your code is required. (Of course you should restore the strict and warnings).
foreach $num (reverse 1..$count){

I recommend against using a previously defined lexical variable as a loop variable. It does not make any difference in this script, but it is a bad practice. In the future, you may be tempted to use that variable after the loop has finished and it almost certainly will not contain what you expect. Use the syntax haukex showed.

Bill
  • Comment on Re: The error says the value is uninitialized, but it works anyway
  • Download Code

Replies are listed 'Best First'.
Re^2: The error says the value is uninitialized, but it works anyway (updated)
by AnomalousMonk (Bishop) on Aug 17, 2019 at 17:29 UTC
    ... using a previously defined lexical variable as a loop variable ... is a bad practice. ... you may be tempted to use that variable after the loop has finished and it almost certainly will not contain what you expect.

    I agree this syntax is Bad Practice and should be avoided, but the variable after the loop has finished will always contain exactly what you expect if you expect it to be absolutely unchanged:

    c:\@Work\Perl\monks>perl -wMstrict -le "my $x = 'foo'; print $x; ;; for $x (7 .. 9) { print qq{ $x}; } ;; print $x; " foo 7 8 9 foo
    This is because the loop variable, whatever it may be ($x in this case), is "topicalized", i.e., localized upon entry to the loop and restored upon loop termination. This surprising bit of Perl-style for-loop behavior (it's completely absent in the C-style for-loop) is why this syntax [Note 1] should be avoided IMHO. Otherwise, it makes no difference whatsoever AFAIK.

    Notes:
    1. ... this syntax ...   By which I mean
          my $x = ...;
          ...
          for $x (...) { ...;  do_something_with($x);  ...; }
      Otherwise, the Perl-style
          for my $x (...) { ...;  do_something_with($x);  ...; }
      is the greatest thing since sliced bread!

    Update: Added Note 1.


    Give a man a fish:  <%-{-{-{-<

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (5)
As of 2019-10-17 23:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Notices?