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);