If we apply operation X to a variable of type Y,
we get a variable of type Z.
####
X(Y) : Z
##
##
$GLOBAL = "static";
$LOCAL = "dynamic";
$LEXICAL = "lexical";
sub show_evaluation_context {
printf (
"evaluation context: %s \n",
join (',', ($GLOBAL, $LOCAL, $LEXICAL))
);
}
sub global_scope {
printf (
"global scope: %s \n",
join (',', ($GLOBAL, $LOCAL, $LEXICAL))
);
show_evaluation_context();
}
global_scope();
##
##
global scope: static,dynamic,lexical
evaluation context: static,dynamic,lexical
##
##
sub local_scope {
local ($LOCAL) = "-------";
printf (
"local scope: %s \n",
join (',', ($GLOBAL, $LOCAL, $LEXICAL))
);
show_evaluation_context();
}
local_scope();
print "\n";
print "but outside local_scope(), we still have:\n";
show_evaluation_context();
##
##
local scope: static,-------,lexical
evaluation context: static,-------,lexical
but outside local_scope(), we still have:
evaluation context: static,dynamic,lexical
##
##
sub lexical_scope {
my ($LEXICAL) = "-------";
printf (
"lexical scope: %s \n",
join (',', ($GLOBAL, $LOCAL, $LEXICAL))
);
show_evaluation_context();
}
sub local_override {
local ($LEXICAL) = 'DYNAMICALLY RE-BOUND VALUE';
lexical_scope();
}
local_override();
print "\n";
lexical_scope();
##
##
lexical scope: static,dynamic,-------
evaluation context: static,dynamic,DYNAMICALLY RE-BOUND VALUE
lexical scope: static,dynamic,-------
evaluation context: static,dynamic,lexical
##
##
package Foo;
$VAR1 = "VAR1 in package 'Foo'.";
package main;
$VAR1 = "VAR1 in package 'main'.";
$VAR2 = "VAR2 in package 'main'.";
print $Foo::VAR1, "\n";
print $VAR1, "\n";
print $VAR2, "\n";
##
##
VAR1 in package 'Foo'.
VAR1 in package 'main'.
VAR2 in package 'main'.
##
##
my $total = 0;
for $i (1..10) {
$total += $i;
}
print $total, "\n";
##
##
sub sum_of {
my ($item, @list) = @_;
return ((defined $item) ? $item + sum_of (@list) : 0);
}
print sum_of (1..10), "\n";