$ perl 947860.pl
Global symbol "$letter" requires explicit package name at 947860.pl li
+ne 5.
Global symbol "$letter" requires explicit package name at 947860.pl li
+ne 8.
Global symbol "$letter" requires explicit package name at 947860.pl li
+ne 10.
Execution of 947860.pl aborted due to compilation errors (#1)
(F) You've said "use strict" or "use strict vars", which indicates
that all variables must either be lexically scoped (using "my" or
+"state"),
declared beforehand using "our", or explicitly qualified to say
which package the global variable is in (using "::").
BEGIN not safe after errors--compilation aborted at /usr/lib/perl5/5.1
+0/Carp/Heavy.pm line 11.
Compilation failed in require at /usr/lib/perl5/5.10/Carp.pm line 33.
The errors relating to $letter and the diagnostic can be fixed with a "my $letter;" (our and state are more specialized, my is the most common way of declaring variables.) Generally it is best to fix the first few obvious errors before worrying about less-obvious ones. That's because Perl, like most compilers, can get confused enough by errors early in the program that it can't handle otherwise-valid code later in the program. So, fixing just the declaration of $letter,
use strict;
use warnings;
use diagnostics;
my $letter = 'b';
addtwo();
addtwo();
print $letter;
sub addtwo {
$letter +=2;
}
says
Argument "b" isn't numeric in addition (+) at 947860a.pl line 10 (#1)
(W numeric) The indicated string was fed as an argument to an oper
+ator
that expected a numeric value instead. If you're fortunate the me
+ssage
will identify which operator was so unfortunate.
4
Now, what is two more than "b"? Well... it depends. The interpretation that Perl took is to convert "b" to zero. It might be that the "b" should have been a number, but my *guess* is that addtwo was meant to increment the letter twice, to get "d" after the first call and "f" after the second. There is a way of doing that: "$letter++" will produce the next letter, because of some magic that applies only to the autoincrement "++" operator. That magic doesn't apply to assignment operators such as "+=". The details are in perlop.
Fixing that, and fixing the spacing to make the function stand out better (the perltidy command from the Perl::Tidy module in CPAN can do it automatically, although it's overkill for these few lines) we get
use strict;
use warnings;
use diagnostics;
my $letter = 'b';
addtwo();
addtwo();
print $letter;
sub addtwo {
$letter++;
$letter++;
}
which prints
f
|