http://qs321.pair.com?node_id=11128924


in reply to Passing Variables

Lets refactor that to be a little more Perl idiomatic:

################################################### # # # 2/24/21 # # Program takes finds the average in an # # array and lists out the numbers that were # # above the average found. # # # ################################################### use strict; use warnings; my @numbers = qw(4 12 18 21 35); my $average = find_average(@numbers); my @high_avg = above_average($average, @numbers); print <<STR; The average found for this list is: $average The numbers that were found above average are: @high_avg STR sub find_average { die "find_average expects to be passed a list of numbers" if !@_; my $sum = 0; $sum += $_ for @_; return $sum / @_; } sub above_average { my ($average_num, @values) = @_; return grep {$_ > $average_num} @values; }

Prints:

The average found for this list is: 18 The numbers that were found above average are: 21 35

First note the use of strictures (use strict; use warnings;). Always use strictures.

Then notice that subs are called without & in modern Perl. There are nasty subtle traps using & to call subs, so don't do that.

Use grep to select elements from a list.

Use here docs for outputting large blocks of text.

Use Statement Modifiers for very simple conditional statements or loops.

Return simple results directly rather than assigning them to an intermediate variable, but always use return to make it clear what is returned from the sub.

Assigning a list or array to a scalar (something that has $ at the front) assigns the count of elements so you can use that directly instead of counting the elements as they are processed.

Optimising for fewest key strokes only makes sense transmitting to Pluto or beyond