You are close. All arguments to a subroutine are passed as a single ordered array. That array is accessed in the subroutine by @_.
my ($average_num, @nums) = @_; means take the first element of @_ and make a copy of it into the subroutine's variable $average_num, then copy all of the elements that are "left over" to the subroutine's array of @nums.
my ($average_num, $first_num, @rest_of_nums) = @_; is possible. But you can't have my ($average_num, @nums, $last_num) = @_; because @nums will consume all entries that are left in @_ and $last_num will be undefined.
The @_ array is very special and some tricks can be played in certain circumstances. None of which apply in 99.9% of Perl code.
Consider the following:
use strict;
use warnings;
my @numbers = qw(4 12 18 21 35);
my $average = find_average(\@numbers);
print "The average found for this list is: $average \n" ;
## find_average will cause a fatal error if
## there are no numbers in the array.
sub find_average
{
# subroutine gets a sinle value which is a reference
# to an array, not an arry itself. This is much, much
# faster if say the array has say 1,000 elements.
my $num_array_ref = shift;
# could be: my ($num_array_ref) = @_;
# The shift operation is very slightly faster if
# only one value is involved.
my $sum; # no need to set $sum=0;
# but I wouldn't quibble if you did that.
foreach my $num (@$num_array_ref)
{
$sum += $num;
}
my $avg = $sum / @$num_array_ref;
return $avg;
}
__END__
The average found for this list is: 18
Update: I know that some Monks would say that the "return $avg" statement is extraneous because by default, Perl will return the value of the last statement in the subroutine. I don't want to relitigate that except to say that an explicit return statement is in my opinion good practice.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|