$a
and $b
are special variables used in
various forms of sort, in the reduce
function
provided by List::Util and maybe in a few other places.
Because of that they are two variables that can be used without declaration even when use strict is in effect.
While it might be cool that you use variables without declaration, but if that's what you want then just go without use strict;
and then don't be surprised that few people will be ready to help you fixing your code.
So assuming you want the effect of use strict
that requires you to declare every variable before use, then you might notice
it won't require the declaration of $a
or $b
.
In other words, this code will work:
use strict;
use warnings;
$a = 23;
$b = 19;
print $a+$b, "\n"; # 42
The problem is not really in the use of these variable outside of sort
and the other special cases.
They won't be even changed by a call to sort
as they are going to be localized for the duration of sort
as you can see here:
use strict;
use warnings;
$a = 23;
$b = 19;
print $a+$b, "\n"; # 42
my @numbers = sort {$a <=> $b } 1, 3, 2;
print "@numbers\n"; # 1 2 3
print $a+$b, "\n"; # 42
It's just the confusion they might cause to someone who is not familiar with their special behavior, and the bad example we provide to others.
Therefore a long time ago I've decided that I won't use $a
or $b
even in short snippets or sample code.
If I want to use short and meaningless variables names, there are plenty of other letters in the abc.
BTW Not using $a
and $b
is one of the suggestions if you'd like to
improve your code.