Define and call a subroutine with sub. Arguments arrive in @_:

use strict; use warnings;

sub greet {
    my ($name, $greeting) = @_;
    $greeting //= "Hello";   # default value if undef
    return "$greeting, $name!";
}

print greet("Alice"), "\n";          # Hello, Alice!
print greet("Bob", "Hi"), "\n";      # Hi, Bob!

Return multiple values; Perl flattens them into a list:

sub min_max {
    my @nums = sort { $a <=> $b } @_;
    return ($nums[0], $nums[-1]);
}

my ($min, $max) = min_max(5, 2, 8, 1, 9, 3);
print "Min=$min  Max=$max\n";   # Min=1  Max=9

Pass a hash by reference to avoid flattening:

sub show_person {
    my ($person_ref) = @_;
    printf "Name: %s, Age: %d\n",
           $person_ref->{name},
           $person_ref->{age};
}

my %alice = (name => "Alice", age => 30);
show_person(\%alice);