A subroutine gives a group of statements a name so the program can call it when needed.

subroutine A subroutine is a named block of reusable Perl code.

Subroutine Basics

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

sub make_greeting {
    my ($name) = @_;
    my $message = "Hello, $name";
    return $message;
}

my $name = "Perl";
my $greeting = make_greeting($name);

print "name=$name\n";
print "greeting=$greeting\n";
use strict;
use warnings;

sub make_greeting {
    my ($name) = @_;
    my $message = "Hello, $name";
    return $message;
}

my $name = "Mira";
my $greeting = make_greeting($name);

print "name=$name\n";
print "greeting=$greeting\n";
use strict;
use warnings;

sub make_greeting {
    my ($name) = @_;
    my $message = "Hello, $name";
    return $message;
}

my $name = "Ada";
my $greeting = make_greeting($name);

print "name=$name\n";
print "greeting=$greeting\n";
  1. $name ← Perl

    10my $name→ Perl = "Perl"; #@name="Mira", "Ada"11my $greeting = make_greeting($namePerl);
  2. $name ← Perl, $message ← Hello, Perl

    4sub make_greeting {5    my ($name→ Perl) = @_;6    my $message→ Hello, Perl = "Hello, $namePerl";7    return $messageHello, Perl;8}
  3. $greeting ← Hello, Perl

    10my $name = "Perl"; #@name="Mira", "Ada"11my $greeting→ Hello, Perl = make_greeting($namePerl);1213print "name=$namePerl\n";14print "greeting=$greetingHello, Perl\n";
    outputname=Perl
    greeting=Hello, Perl
  1. $name ← Mira

    10my $name→ Mira = "Mira";11my $greeting = make_greeting($nameMira);
  2. $name ← Mira, $message ← Hello, Mira

    4sub make_greeting {5    my ($name→ Mira) = @_;6    my $message→ Hello, Mira = "Hello, $nameMira";7    return $messageHello, Mira;8}
  3. $greeting ← Hello, Mira

    10my $name = "Mira";11my $greeting→ Hello, Mira = make_greeting($nameMira);1213print "name=$nameMira\n";14print "greeting=$greetingHello, Mira\n";
    outputname=Mira
    greeting=Hello, Mira
  1. $name ← Ada

    10my $name→ Ada = "Ada";11my $greeting = make_greeting($nameAda);
  2. $name ← Ada, $message ← Hello, Ada

    4sub make_greeting {5    my ($name→ Ada) = @_;6    my $message→ Hello, Ada = "Hello, $nameAda";7    return $messageHello, Ada;8}
  3. $greeting ← Hello, Ada

    10my $name = "Ada";11my $greeting→ Hello, Ada = make_greeting($nameAda);1213print "name=$nameAda\n";14print "greeting=$greetingHello, Ada\n";
    outputname=Ada
    greeting=Hello, Ada

Follow the Call

  1. $name starts as Perl.
  2. make_greeting($name) passes that value into the subroutine.
  3. Inside the subroutine, $name is read from @_.
  4. $message becomes Hello, Perl.
  5. The caller stores that returned text in $greeting. | value | where it goes | result | | --- | --- | --- | | Perl | subroutine argument | $name | | Hello, Perl | returned value | $greeting |

Exercise: subroutine_basics.pl

Reproduce name=Perl and greeting=Hello, Perl, then use the pinned name variants Mira and Ada to predict greeting=Hello, Mira and greeting=Hello, Ada.