<?xml version="1.0" encoding="windows-1252"?>
<node id="79987" title="Re (tilly) 1: &quot;Junkyard&quot; Puzzle: Average of Numbers" created="2001-05-13 02:17:18" updated="2005-07-19 14:08:39">
<type id="11">
note</type>
<author id="26179">
tilly</author>
<data>
<field name="doctext">
First of all, Perl is list-oriented and handles passed in
arguments by reference.  Therefore the Perlish way to do
this is to just take a list of numbers and work with that.
But I will play off the rule as given even though it is
not the API I would choose.&lt;P&gt;

Also the stricture to avoid having any variables should
not be looked at as just a bizarre restriction.  People who
program in a functional style often do that voluntarily.
With that in mind I offer the following version that
follows the restrictions as a matter of intentional style
and &lt;i&gt;just happens&lt;/i&gt; to solve a more complex problem.
The function is avg_nested which extracts the numbers
from a nested set of arrays of arrays and computes the
average of the entire list:
&lt;code&gt;
sub avg {
  sum(@_) / @_;
}

sub avg_nested {
  avg(flatten_arrays(@_));
}
  
sub flatten_arrays {
  map {ref($_) ? flatten_arrays(@$_) : $_} @_;
}

sub sum {
  @_ ? shift(@_) + sum(@_) : 0;
}
&lt;/code&gt;
&lt;P&gt;

&lt;B&gt;UPDATE&lt;/B&gt;&lt;BR&gt;
[jynx] caught me.  I wrote it, then changed a function
name at the last minute and didn't test properly.  I
forgot to change one flatten to flatten_arrays...</field>
<field name="root_node">
79981</field>
<field name="parent_node">
79981</field>
</data>
</node>
