     Next: Passing in and returning Up: Subroutines, functions, and modules Previous: Variable scoping   Contents   Index

## Returning variables

Variables may be returned from a subroutine, and subsequently captured in the main program, by having a return VARIABLE_LIST; line within the routine. For example,
```  my (\$x, \$y) = (3, 4);
my \$z = times_them(\$x, \$y);
print qq{\$x times \$y is \$z\n};

sub times_them {
my (\$a, \$b) = @_;
my \$c = \$a * \$b;
return \$c;
}
```
You can return, and subsequently capture within the calling program, multiple variables by specifying them in a list:
```  my (\$x, \$y) = (3, 4);
my (\$u, \$v) = times_and_add_them(\$x, \$y);
print qq{\$x times \$y is \$u, and \$x plus \$y is \$v\n};

my (\$a, \$b) = @_;
my \$c = \$a * \$b;
my \$d = \$a + \$b;
return (\$c, \$d);
}
```
It is not necessary to only return at the end of a subroutine; sometimes, it is more natural to return at an earlier stage:
```  my (\$x, \$y) = (3, 4);
if (my \$z = divide_them(\$x, \$y)) {
print qq{\$x divided by \$y is \$z\n};
}
else {
print qq{\$x divided by \$y is infinite\n};
}

sub divide_them {
my (\$a, \$b) = @_;
if (\$b == 0) {
return undef;
}
else {
my \$c = \$a / \$b;
return \$c;
}
}
```
However, you should generally ensure that all branches of your subroutine will return something. The above also illustrates the use of the return value of a subroutine in a conditional - if in the above \$b was zero, the subroutine will return an undefined value, and a friendly message printed out (if this check was not done, and \$b was zero, the program would die with a nasty error message about trying to divide something by zero).