Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

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

by BillKSmith (Monsignor)
on Aug 17, 2019 at 13:14 UTC ( [id://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

Replies are listed 'Best First'.
Re^2: The error says the value is uninitialized, but it works anyway (updated)
by AnomalousMonk (Archbishop) 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
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11104616]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (5)
As of 2024-03-29 13:08 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found