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

value
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";
  1. $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);
  2. $value ← red

    8sub make_label {9    my ($value→ red) = @_;10    return "$prefixtag:$valuered";11}
  3. $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
  1. $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);
  2. $value ← blue

    8sub make_label {9    my ($value→ blue) = @_;10    return "$prefixtag:$valueblue";11}
  3. $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
  1. $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);
  2. $value ← gold

    8sub make_label {9    my ($value→ gold) = @_;10    return "$prefixtag:$valuegold";11}
  3. $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