Different packages can use the same subroutine name without colliding.

namespace separation Namespace separation lets each package own its names independently.

Namespace Separation

system
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";
  1. $system ← metric, $size ← 5, $label ← (empty)

    20my $system→ metric = "metric"; #@system="imperial"21my $size→ 5 = 5;22my $label→ (empty);
  2. if ($system eq "metric")

    24if ($systemmetric eq "metric") {25    $label(empty) = Metric::label($size5);26} else {
  3. $size ← 5

    6sub label {7    my ($size→ 5) = @_;8    return "$size5 cm";9}
  4. $label ← 5 cm

    24if ($system eq "metric") {25    $label→ 5 cm = Metric::label($size5);26} else {
  5. print "system=$system ";

    30print "system=$systemmetric\n";31print "label=$label5 cm\n";
    outputsystem=metric
    label=5 cm
  1. $system ← imperial, $size ← 5, $label ← (empty)

    20my $system→ imperial = "imperial";21my $size→ 5 = 5;22my $label→ (empty);
  2. else

    25    $label = Metric::label($size);26} else {27    $label(empty) = Imperial::label($size5);28}
  3. $size ← 5

    13sub label {14    my ($size→ 5) = @_;15    return "$size5 in";16}
  4. $label ← 5 in

    26} else {27    $label→ 5 in = Imperial::label($size5);28}
  5. print "system=$system ";

    30print "system=$systemimperial\n";31print "label=$label5 in\n";
    outputsystem=imperial
    label=5 in