Here's a fun approach. We can encapsulate our maximum-finding logic
inside of a closure-based factory function that makes "maximum
finders":
sub make_max_finder {
my $max;
sub {
for (@_) { $max = $_ if !defined $max || $_ > $max }
$max;
}
}
Then we can create a new maximum finder whenever we need one by
calling the factory function:
my $max_finder = make_max_finder();
We can feed values to our newly made maximum finder, and it will remember the maximum
value it has seen:
$max_finder->(0);
print $max_finder->(); # 0
print $max_finder->(-1); # 0
print $max_finder->(2); # 2
We can pass it more than one value at a time, too:
print $max_finder->(-1, 3, 0); # 3
print $max_finder->(-1, 0, 1); # 3
With this factory, we can solve your problem like so:
my $max_finder = make_max_finder();
while (my $next_val = get_next_value()) {
$max_finder->($next_val);
}
$max_finder->(); # retrieve maximum
Or, if you have the memory to hold all of your values in an array,
the "one-shot" option is available:
my $max_value = make_max_finder()->(@values);
Cheers,
Tom
-
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.