Alternatives are tried left to right, so overlapping alternatives should be ordered deliberately.

alternation-order When alternatives overlap, the first successful alternative determines the capture. Put more specific alternatives first when that is the intended result.

Alternation Order

word
alternation_order.pl
Replay: real traced execution (multi-file project)
use strict;
use warnings;

my $word = "catalog";
my ($label) = $word =~ /(cat|catalog|dog)/;
$label = defined $label ? $label : "none";
my $exact = $word eq $label ? "yes" : "no";

print "word=$word\n";
print "label=$label\n";
print "exact=$exact\n";
use strict;
use warnings;

my $word = "cat";
my ($label) = $word =~ /(cat|catalog|dog)/;
$label = defined $label ? $label : "none";
my $exact = $word eq $label ? "yes" : "no";

print "word=$word\n";
print "label=$label\n";
print "exact=$exact\n";
use strict;
use warnings;

my $word = "dog";
my ($label) = $word =~ /(cat|catalog|dog)/;
$label = defined $label ? $label : "none";
my $exact = $word eq $label ? "yes" : "no";

print "word=$word\n";
print "label=$label\n";
print "exact=$exact\n";
  1. $word ← catalog, $label ← cat, $exact ← no

    4my $word→ catalog = "catalog"; #@word="cat", "dog"5my ($label→ cat) = $wordcatalog =~ /(cat|catalog|dog)/;6$labelcat = defined $label ? $label : "none";7my $exact→ no = $wordcatalog eq $labelcat ? "yes" : "no";89print "word=$wordcatalog\n";10print "label=$labelcat\n";11print "exact=$exactno\n";
    outputword=catalog
    label=cat
    exact=no
  1. $word ← cat, $label ← cat, $exact ← yes

    4my $word→ cat = "cat";5my ($label→ cat) = $wordcat =~ /(cat|catalog|dog)/;6$labelcat = defined $label ? $label : "none";7my $exact→ yes = $wordcat eq $labelcat ? "yes" : "no";89print "word=$wordcat\n";10print "label=$labelcat\n";11print "exact=$exactyes\n";
    outputword=cat
    label=cat
    exact=yes
  1. $word ← dog, $label ← dog, $exact ← yes

    4my $word→ dog = "dog";5my ($label→ dog) = $worddog =~ /(cat|catalog|dog)/;6$labeldog = defined $label ? $label : "none";7my $exact→ yes = $worddog eq $labeldog ? "yes" : "no";89print "word=$worddog\n";10print "label=$labeldog\n";11print "exact=$exactyes\n";
    outputword=dog
    label=dog
    exact=yes