Deparsing the code shows what Perl sees (in tmp.pl):
#!/usr/bin/perl -w use strict; sub ten { 10 } print "9 .. 10 - 1 with constant\n"; for my $i (9 .. ten - 1) { print $i, "\n"; } print "-> unexpected\n\n";
gives when deparsed:
corion@outerlimits:~/Projekte$ perl -MO=Deparse tmp.pl BEGIN { $^W = 1; } use strict; sub ten { 10; } print "9 .. 10 - 1 with constant\n"; foreach my $i (9 .. ten(-1)) { print $i, "\n"; } print "-> unexpected\n\n"; tmp.pl syntax OK
Since you don't have a prototype on your constant, the -1 gets interpreted as an argument to your subroutine call ten. The fix is to use a prototype, or to use the constant module, which does the same:
sub ten() { 10 };
... or ...
use constant ten => 10;
In reply to Re: replacing literals with constants
by Corion
in thread replacing literals with constants
by hexcoder
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |