package Tool::Box; @ISA = qw(Exporter); @EXPORT = qw(); @EXPORT_OK = qw( Ave Max Min Uniq Stats ); %EXPORT_TAGS = ( ':ALL' => [ qw(Ave Max Min Uniq Stats) ] ); $VERSION = '0.01'; use strict; use warnings; sub Max { my $max; my $find_max = sub { for ( @_ ) { $max = $_ if ! defined $max || $_ > $max; } return $max; }; $find_max->( @_ ); return $find_max; } sub Min { my $min; my $find_min = sub { for ( @_ ) { $min = $_ if ! defined $min || $_ < $min; } return $min; }; $find_min->( @_ ); return $find_min; } sub Ave { my $tot; my $cnt; my $find_ave = sub { $cnt += @_; $tot += $_ for @_; return $cnt ? $tot / $cnt : undef; }; $find_ave->( @_ ); return $find_ave; } sub Uniq { my %uniq; my $find_uniq = sub { @uniq{ @_ } = (); if ( defined wantarray ) { return wantarray ? keys %uniq : scalar keys %uniq; } }; $find_uniq->( @_ ); return $find_uniq; } sub Stats { my $stat = {}; my ($cnt, $max, $min, $tot); $stat->{ADD} = sub { $cnt += @_; for ( @_ ) { $tot += $_; $max = $_ if ! defined $max || $_ > $max; $min = $_ if ! defined $min || $_ < $min; } }; $stat->{MAX} = sub { $max }; $stat->{MIN} = sub { $min }; $stat->{AVE} = sub { $cnt ? $tot / $cnt : undef }; $stat->{TOT} = sub { $tot }; $stat->{ADD}->( @_ ); return $stat; } 42; __END__ =head1 NAME Tool::Box - A hodge podge of useful functions =head1 VERSION Version 0.01 =head1 SYNOPSIS use Tool::Box; use Tool::Box qw(Max Min); use Tool::Box ':ALL'; =head1 DESCRIPTION This module is a collection of commonly used functions to do what you +want how you want. =head1 EXPORTS None by default =head1 FUNCTIONS =head2 Stats Function generator that allows you to keep track of max/min/ave/tot use Tool::Box qw(Stats); my $stat = Stats(1 .. 10); print $stat->{TOT}(); # 55 print $stat->{AVE}(); # 5.5 print $stat->{MIN}(); # 1 print $stat->{MAX}(); # 10 for (8 .. 12) { $stat->{ADD}( $_ ); } print $stat->{MAX}(); # 12 print $stat->{TOT}(); # 105 =head2 Ave Function generator that allows you to keep track of average value use Tool::Box qw(Ave); my $ave = Ave(1 .. 10)->(); print $ave; # 5.5 $ave = Ave(); for (4 .. 9) { $ave->( $_ ); } print $ave->(); # 6.5 $ave = Ave(20 .. 30); print $ave->(); # 25 =head2 Max Function generator that allows you to keep track of maximum value use Tool::Box qw(Max); my $max = Max(1 .. 10)->(); print $max; # 10 $max = Max(); for (4 .. 9) { $max->( $_ ); } print $max->(); # 9 $max = Max(20 .. 30); print $max->(); # 30 =head2 Min Function generator that allows you to keep track of minimum value use Tool::Box qw(Min); my $min = Min(1 .. 10)->(); print $min; # 1 $min = Min(); for (4 .. 9) { $min->( $_ ); } print $min->(); # 4 $min = Min(20 .. 30); print $min->(); # 20 =head2 Uniq Function generator that allows you to keep track of unique things use Tool::Box qw(Uniq); my $count = Uniq(1,1,2,3,1,7)->(); print $count; # 4 my @u_nums = Uniq(1,1,2,3,1,7)->(); print join ' ' , @u_nums; # 1 2 3 7, though the order is not guarant +eed my $uniq = Uniq(); while ( <DATA> ) { chomp; $uniq->( $_ ); } my $unique_lines = $uniq->(); =head1 AUTHOR Joshua Gatcomb, <Limbic_Region_2000@Yahoo.com> =head1 ACKNOWLEDGEMENTS Various people from PerlMonks (L<http://www.perlmonks.org>) provided invaluable input. =head1 BUGS Functions that expect numeric arguments are not verifying they are num +eric =head1 TO DO =head1 COPYRIGHT Copyright (c) 2004 Joshua Gatcomb. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L<perl>(1) =cut
Yes, I know that some of these functions already exist in List::Util. I chose them because the standard wheel doesn't always fit your bicycle (values are not all available at once). I got the idea from one of tmoertel's posts. I want to stress that this post is about the idea in general and not this specific proof of concept.
So is this a good idea or not? I was thinking along the lines of going through the FAQs and providing ready made solutions (such as getting the intersection of two arrays). I can see it going both ways: if beginner's don't learn fundementals where will the hand-holding end? If it is a good idea, what should be included? Besides going through the FAQs I was also thinking about going through Snippets.
Cheers - L~R
Updated 2004-11-16: I changed the all cap function names, as it is something I normally don't do anyway, after a couple of comments against them.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: RFC: Tool::Box
by hardburn (Abbot) on Nov 15, 2004 at 15:29 UTC | |
|
Re: RFC: Tool::Box
by borisz (Canon) on Nov 15, 2004 at 15:40 UTC | |
by Limbic~Region (Chancellor) on Nov 15, 2004 at 16:08 UTC | |
|
Re: RFC: Tool::Box
by jdporter (Paladin) on Nov 15, 2004 at 15:46 UTC | |
by Limbic~Region (Chancellor) on Nov 15, 2004 at 16:13 UTC | |
by tmoertel (Chaplain) on Nov 16, 2004 at 06:22 UTC | |
by Limbic~Region (Chancellor) on Nov 16, 2004 at 13:22 UTC | |
|
Re: RFC: Tool::Box
by itub (Priest) on Nov 15, 2004 at 17:10 UTC | |
|
Re: RFC: Tool::Box
by tmoertel (Chaplain) on Nov 16, 2004 at 05:48 UTC | |
by Limbic~Region (Chancellor) on Nov 16, 2004 at 14:07 UTC | |
by diotalevi (Canon) on Nov 16, 2004 at 17:51 UTC | |
by Limbic~Region (Chancellor) on Nov 20, 2004 at 21:22 UTC | |
by dragonchild (Archbishop) on Nov 21, 2004 at 04:43 UTC | |
by Limbic~Region (Chancellor) on Nov 21, 2004 at 14:25 UTC | |
by dragonchild (Archbishop) on Nov 22, 2004 at 13:29 UTC | |
| |
by tmoertel (Chaplain) on Nov 23, 2004 at 01:49 UTC | |
by ihb (Deacon) on Nov 17, 2004 at 10:03 UTC |