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.
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. :)
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.
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";
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With