When run as-is, it says
$ 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
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
Outside of code tags, you may need to use entities for some characters:
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.
|
|