Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic
 
PerlMonks  

Re: scalar slice assignment doubt

by gone2015 (Deacon)
on Feb 28, 2009 at 12:45 UTC ( [id://747137] : note . print w/replies, xml ) Need Help??


in reply to scalar slice assignment doubt

The problem is "context". Perl will continue to trip you up until you understand the significance of context... see Context Tutorial.

In this case $a = (a..c) ; you're tripping over the magical properties of '..' in scalar context. Now, you may have thought that '..' was a list constructor. Or, you may have thought that (a..c) was a list constructor. Unfortunately, only the the first is ever the case, and then only in "list context".

The action of '..' is described in perlop. In scalar context when the arguments are constants it compares the arguments with $. (the most recent input file line number) such that: as you read the input lines, 20..25 returns false for lines 1 to 19, then 1, 2, 3, 4, 5 for lines 20 to 24, 6E0 for line 25 (the last line in the range) and false for the rest of the file.

Now, $a = (a..c) is equivalent to $a = 'a'..'c'. Since neither argument is numeric it's not clear what Perl should do. Further, this requires $. to have a value. It appears that Perl decides you are immediately at the end of this badly defined range -- so returns '1E0'.

Apart from context, the other take-home here is to use use strict and use warnings.

  • with use strict Perl would have thrown out (a..c) as "Bareword "a" not allowed..." which whould at least have required you to tidy up to ('a'..'c') and might have rung some alarm bells.

  • with use warnings Perl would have thrown:

      Argument "a" isn't numeric in range (or flip)...
      Use of uninitialized value in range (or flip)...
      Argument "c" isn't numeric in range (or flop)...
      Use of uninitialized value in range (or flop)...
    
    warnings at you -- which would have told you something wasn't entirely going to plan !