in reply to Local Scope Variables

Your mistake: local does not declare a variable.

All it does is, at runtime, temporarily save the value of the global variable, and clear it; and restore it to its old value when the scope is left.

Taking into account that the global variables $a and $b have a special status with regard to strict, because of their connection to sort, and these therefore don't need a declaration, it should be clear to you by now that strict simply complains because you haven't actually declared $aa.

For that purpose, use

use vars qw($aa);
or our, as in
our $aa;
to declare it as a global variable; or in a similar way, use my to make it a lexical variable:
my $aa;
n.b. If you want to declare multiple variables at once with our or my, put the comma separated list between parentheses. For use vars, put the names in qw(...) next to each other separated with whitespace — not commas.

Note that in general it's a big mistake to make $a or $b a lexical variable, because that would mess up their use with sort really good.

For more on the difference between lexical variables and global variables, see perlfaq7: What's the difference between dynamic and lexical (static) scoping? Between local() and my()?