Modules and Packages
Lexical Encapsulation
A lexical variable declared with my can support package code without becoming a package variable.
encapsulation
Encapsulation keeps implementation details behind a small public subroutine.
Lexical Encapsulation
lexical_encapsulation.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;
package Labeler;
my $prefix = "tag";
sub make_label {
my ($value) = @_;
return "$prefix:$value";
}
package main;
my $value = "red";
my $label = Labeler::make_label($value);
print "value=$value\n";
print "label=$label\n";
use strict;
use warnings;
package Labeler;
my $prefix = "tag";
sub make_label {
my ($value) = @_;
return "$prefix:$value";
}
package main;
my $value = "blue";
my $label = Labeler::make_label($value);
print "value=$value\n";
print "label=$label\n";
use strict;
use warnings;
package Labeler;
my $prefix = "tag";
sub make_label {
my ($value) = @_;
return "$prefix:$value";
}
package main;
my $value = "gold";
my $label = Labeler::make_label($value);
print "value=$value\n";
print "label=$label\n";
$prefix ← tag, $value ← red
6my $prefix→ tag = "tag";78sub make_label {9 my ($value) = @_;10 return "$prefix:$value";11}1213package main;1415my $value→ red = "red"; #@value="blue", "gold"16my $label = Labeler::make_label($valuered);$value ← red
8sub make_label {9 my ($value→ red) = @_;10 return "$prefixtag:$valuered";11}$label ← tag:red
15my $value = "red"; #@value="blue", "gold"16my $label→ tag:red = Labeler::make_label($valuered);1718print "value=$valuered\n";19print "label=$labeltag:red\n";outputvalue=red label=tag:red
$prefix ← tag, $value ← blue
6my $prefix→ tag = "tag";78sub make_label {9 my ($value) = @_;10 return "$prefix:$value";11}1213package main;1415my $value→ blue = "blue";16my $label = Labeler::make_label($valueblue);$value ← blue
8sub make_label {9 my ($value→ blue) = @_;10 return "$prefixtag:$valueblue";11}$label ← tag:blue
15my $value = "blue";16my $label→ tag:blue = Labeler::make_label($valueblue);1718print "value=$valueblue\n";19print "label=$labeltag:blue\n";outputvalue=blue label=tag:blue
$prefix ← tag, $value ← gold
6my $prefix→ tag = "tag";78sub make_label {9 my ($value) = @_;10 return "$prefix:$value";11}1213package main;1415my $value→ gold = "gold";16my $label = Labeler::make_label($valuegold);$value ← gold
8sub make_label {9 my ($value→ gold) = @_;10 return "$prefixtag:$valuegold";11}$label ← tag:gold
15my $value = "gold";16my $label→ tag:gold = Labeler::make_label($valuegold);1718print "value=$valuegold\n";19print "label=$labeltag:gold\n";outputvalue=gold label=tag:gold