Subroutines and Arguments
Positional Arguments
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
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";
$item ← book, $quantity ← 2
10my $item→ book = "book";11my $quantity→ 2 = 2; #@quantity=1, 412my $summary = describe_order($itembook, $quantity2);$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}$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
$item ← book, $quantity ← 1
10my $item→ book = "book";11my $quantity→ 1 = 1;12my $summary = describe_order($itembook, $quantity1);$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}$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
$item ← book, $quantity ← 4
10my $item→ book = "book";11my $quantity→ 4 = 4;12my $summary = describe_order($itembook, $quantity4);$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}$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
$itemstarts asbook.$quantitystarts as2.describe_order($item, $quantity)passes item first and quantity second.- The subroutine unpacks those positions from
@_. $summarybecomes2 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.