in reply to Re^3: A short whishlist of Perl5 improvements leaping to Perl7
in thread A short whishlist of Perl5 improvements leaping to Perl7
short version:*
- basically only file and function scope are automatic.
- all deeper nested scopes need to be explicit. Implicit effects there - if allowed - belong to the surrounding file/function scope.
- nested subs are tricky
1. Any assignment to an undeclared new variable implies a "implicit" my when in
- file-scope (outside any sub)
$x = 1 ==> my $x =1
- function-scope
sub foo { $x = 1; ... } ==> sub foo { my $x =1; ... }
- loop-header but NOT body
for $x (@a) {...} ==> for my $x (@a) {...}
- some commands like open *
open $fh, ... ==> open my $fh, ...
3. No hoisting, a variable accessed before an implicit my still belongs to the upper scope and needs to be declared there
4. loop-bodies and naked blocks (technically the same) follow the old rules
- to restrict the scope of a var you'll still need an explicit my
- an implicit my (i.e. assignment to a new var) belongs to the outer scope, starting with the block
{ $x=42 }; print $x; => 42
5. ( ??? ) nested/anonymous subs are tricky, when it comes to closed over vars
- if they follow rule 1, than we need a declaration alike Py's nonlocal ... maybe its or over to mark vars avoiding implicit my
- if they are exempt from rule 1 and rather act like 4, we get a break in symmetry
- another solution would be a new keyword fun to create a sub with auto-mine while keeping sub explicit.
- see point 5
8. special global vars are exempt from implicit my.
9. Last but not least automine activates strict
So ...
- Did I forget a case?
- Do you need examples?
- Please inform yourself about closures before judging.
Cheers Rolf
(addicted to the Perl Programming Language :)
Wikisyntax for the Monastery
°) actually not in the case of map and grep but for all of List::Util , try return to see the difference
*) updated