Modules and Packages
Namespace Separation
Different packages can use the same subroutine name without colliding.
namespace separation
Namespace separation lets each package own its names independently.
Namespace Separation
namespace_separation.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;
package Metric;
sub label {
my ($size) = @_;
return "$size cm";
}
package Imperial;
sub label {
my ($size) = @_;
return "$size in";
}
package main;
my $system = "metric";
my $size = 5;
my $label;
if ($system eq "metric") {
$label = Metric::label($size);
} else {
$label = Imperial::label($size);
}
print "system=$system\n";
print "label=$label\n";
use strict;
use warnings;
package Metric;
sub label {
my ($size) = @_;
return "$size cm";
}
package Imperial;
sub label {
my ($size) = @_;
return "$size in";
}
package main;
my $system = "imperial";
my $size = 5;
my $label;
if ($system eq "metric") {
$label = Metric::label($size);
} else {
$label = Imperial::label($size);
}
print "system=$system\n";
print "label=$label\n";
$system ← metric, $size ← 5, $label ← (empty)
20my $system→ metric = "metric"; #@system="imperial"21my $size→ 5 = 5;22my $label→ (empty);if ($system eq "metric")
24if ($systemmetric eq "metric") {25 $label(empty) = Metric::label($size5);26} else {$size ← 5
6sub label {7 my ($size→ 5) = @_;8 return "$size5 cm";9}$label ← 5 cm
24if ($system eq "metric") {25 $label→ 5 cm = Metric::label($size5);26} else {print "system=$system ";
30print "system=$systemmetric\n";31print "label=$label5 cm\n";outputsystem=metric label=5 cm
$system ← imperial, $size ← 5, $label ← (empty)
20my $system→ imperial = "imperial";21my $size→ 5 = 5;22my $label→ (empty);else
25 $label = Metric::label($size);26} else {27 $label(empty) = Imperial::label($size5);28}$size ← 5
13sub label {14 my ($size→ 5) = @_;15 return "$size5 in";16}$label ← 5 in
26} else {27 $label→ 5 in = Imperial::label($size5);28}print "system=$system ";
30print "system=$systemimperial\n";31print "label=$label5 in\n";outputsystem=imperial label=5 in