Perl receives subroutine arguments in @_, often unpacked into lexical variables.

positional argument A positional argument gets its meaning from where it appears in the call.

Positional Arguments

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

sub describe_order {
    my ($item, $quantity) = @_;
    my $summary = "$quantity x $item";
    return $summary;
}

my $item = "book";
my $quantity = 2;
my $summary = describe_order($item, $quantity);

print "item=$item\n";
print "quantity=$quantity\n";
print "summary=$summary\n";
use strict;
use warnings;

sub describe_order {
    my ($item, $quantity) = @_;
    my $summary = "$quantity x $item";
    return $summary;
}

my $item = "book";
my $quantity = 1;
my $summary = describe_order($item, $quantity);

print "item=$item\n";
print "quantity=$quantity\n";
print "summary=$summary\n";
use strict;
use warnings;

sub describe_order {
    my ($item, $quantity) = @_;
    my $summary = "$quantity x $item";
    return $summary;
}

my $item = "book";
my $quantity = 4;
my $summary = describe_order($item, $quantity);

print "item=$item\n";
print "quantity=$quantity\n";
print "summary=$summary\n";
  1. $item ← book, $quantity ← 2

    10my $item→ book = "book";11my $quantity→ 2 = 2; #@quantity=1, 412my $summary = describe_order($itembook, $quantity2);
  2. $item ← book, $quantity ← 2, $summary ← 2 x book

    4sub describe_order {5    my ($item→ book, $quantity→ 2) = @_;6    my $summary→ 2 x book = "$quantity2 x $itembook";7    return $summary2 x book;8}
  3. $summary ← 2 x book

    11my $quantity = 2; #@quantity=1, 412my $summary→ 2 x book = describe_order($itembook, $quantity2);1314print "item=$itembook\n";15print "quantity=$quantity2\n";16print "summary=$summary2 x book\n";
    outputitem=book
    quantity=2
    summary=2 x book
  1. $item ← book, $quantity ← 1

    10my $item→ book = "book";11my $quantity→ 1 = 1;12my $summary = describe_order($itembook, $quantity1);
  2. $item ← book, $quantity ← 1, $summary ← 1 x book

    4sub describe_order {5    my ($item→ book, $quantity→ 1) = @_;6    my $summary→ 1 x book = "$quantity1 x $itembook";7    return $summary1 x book;8}
  3. $summary ← 1 x book

    11my $quantity = 1;12my $summary→ 1 x book = describe_order($itembook, $quantity1);1314print "item=$itembook\n";15print "quantity=$quantity1\n";16print "summary=$summary1 x book\n";
    outputitem=book
    quantity=1
    summary=1 x book
  1. $item ← book, $quantity ← 4

    10my $item→ book = "book";11my $quantity→ 4 = 4;12my $summary = describe_order($itembook, $quantity4);
  2. $item ← book, $quantity ← 4, $summary ← 4 x book

    4sub describe_order {5    my ($item→ book, $quantity→ 4) = @_;6    my $summary→ 4 x book = "$quantity4 x $itembook";7    return $summary4 x book;8}
  3. $summary ← 4 x book

    11my $quantity = 4;12my $summary→ 4 x book = describe_order($itembook, $quantity4);1314print "item=$itembook\n";15print "quantity=$quantity4\n";16print "summary=$summary4 x book\n";
    outputitem=book
    quantity=4
    summary=4 x book

Follow the Positions

  1. $item starts as book.
  2. $quantity starts as 2.
  3. describe_order($item, $quantity) passes item first and quantity second.
  4. The subroutine unpacks those positions from @_.
  5. $summary becomes 2 x book. | position | argument | local name | | --- | --- | --- | | 1 | book | $item | | 2 | 2 | $quantity | | result | 2 x book | $summary |

Exercise: positional_args.pl

Reproduce item=book, quantity=2, and summary=2 x book, then use the pinned quantity variants 1 and 4 to predict summary=1 x book and summary=4 x book.