Subs
- Can be defined anywhere in the source code.
- Subroutines are always global. There are no local subroutines. (At
least until we get into packages)
- Recursion is supported.
Passing parameters
- Any number of parameters can be passed.
- All parms go into a special list called @_
sub add() { return $_[0] + $_[1]; }
print add( 47,23 ); # prints 70
- @_ can be processed
like any other list
sub add() {
my $sum = 0;
for my $val ( @_ ) {
$sum += $val;
} # for
return $sum;
} # sub
print add( 47, 23, 12, 1.5 ); # prints 83.5
print add(); # prints 0
Return
values
- The last value in a function is the return value of the function.
- Use the return to
make the return value explicit.
- Subs can return lists or scalars.
- The wantarray() tells
the sub the context in which it was called.
#!perl -w
use strict;
my @house = qw( 5x7 10x12 17x24 6x9 12x18 );
my @rooms = bigrooms( 100, @house );
print "Big rooms are: ", join( ", ", @rooms ), "\n";
my $footage = bigrooms( 100, @house );
print "Total size = $footage sq. ft.\n";
# Pull out only those rooms with more than 100 specified size
# In scalar context, return the total size of the rooms kept
# In list context, return the list of rooms that are big enough
sub bigrooms() {
my $minsize = shift; # by default, shifts @_
die "Minimum size must be greater than 0" unless ($minsize > 0);
my $total = 0;
my @keepers = ();
for my $spec ( @_ ) {
$spec =~ /^(\d+)x(\d+)$/ or die "Invalid room spec passed: $spec";
my $sqft = $1 * $2;
if ( $sqft >= $minsize ) {
push( @keepers, $spec );
$total += $sqft;
} # if
} # for
if ( wantarray() ) {
return @keepers;
} else {
return $total;
}
}
Big rooms are: 10x12, 17x24, 12x18
Total size = 744 sq. ft.
|
|
|