Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Certain programs in "Learning Perl" 6th ed. don't work with "use 5.014" - why?

Tags:

perl

I'm learning Perl with the Llama, 6th ed., and some of the programs in the first chapters don't work with "use 5.014", and I'm not sure why. For example:

#!/usr/bin/perl

#use 5.014;

$n = 1;
while ($n < 10) {
        $sum += $n;
        $n += 2;
}
print "The total was $sum.\n";

This works with "use 5.014" commented out, but with it included, I get these errors:

Global symbol "$n" requires explicit package name at ch3loop.pl line 5.
Global symbol "$n" requires explicit package name at ch3loop.pl line 6.
Global symbol "$sum" requires explicit package name at ch3loop.pl line 7.
Global symbol "$n" requires explicit package name at ch3loop.pl line 7.
Global symbol "$n" requires explicit package name at ch3loop.pl line 8.
Global symbol "$sum" requires explicit package name at ch3loop.pl line 10.
Execution of ch3loop.pl aborted due to compilation errors.

However, if I put "my" before the first instances of the variables, it still doesn't run, but for a different reason:

Global symbol "$sum" requires explicit package name at ch3loop.pl line 10.
Execution of ch3loop.pl aborted due to compilation errors.

Can someone explain what's going on? I know I can just run this without "use 5.014", but it does say on the cover of the book that the 6th ed. "covers Perl 5.14", so I'm puzzled.

Thanks.

like image 209
Marc Adler Avatar asked Aug 04 '12 02:08

Marc Adler


3 Answers

Since v5.12, when you say use VERSION with nothing else, it automatically turns on strict. Since we don't cover the ways around your particular problem until the "Subroutines" chapter, we don't do anything in the previous chapters that require you to do that.

Learning Perl is designed as a tutorial, so we expect that you won't do anything in a program until we've explicitly shown it to you. That way, we don't have to explain all of Perl in the first chapter.

I tend to not use any version declaration until I use a feature that requires it, and we don't do that in the beginning chapters.

Good luck with the rest of the book. :)

like image 156
brian d foy Avatar answered Nov 17 '22 11:11

brian d foy


I guess that after that version it automatically enables use strict mode, which forces you declare the scope of each variable. (this is generally a good thing, and it makes you much less likely to make hard to spot mistakes).

You're likely getting the $sum error because I'm guessing you put my $sum inside the while loop, so it is out of scope in the final print statement.

You want to set my $sum = 0; right before and outside the while loop, so that it maintains scope outside of the while loop. If you declare sum inside the while loop, the value will expire and be reset after each iteration of the loop, and it will not exist when you try to print it.

like image 36
Tim Avatar answered Nov 17 '22 09:11

Tim


use <version>; enables strict by default. So declare the variables like below-

#!/usr/bin/perl
use 5.014;
my $sum;
my $n=1;

while ($n < 10) {
        $sum += $n;
        $n += 2;
}
print "The total was $sum.\n";
like image 38
AnBisw Avatar answered Nov 17 '22 11:11

AnBisw