3 # Copyright (c) 1997-2006 Graham Barr <gbarr@pobox.com>. All rights reserved.
4 # This program is free software; you can redistribute it and/or
5 # modify it under the same terms as Perl itself.
10 use vars qw(@ISA @EXPORT_OK $VERSION $XS_VERSION $TESTING_PERL_ONLY);
14 @EXPORT_OK = qw(first min max minstr maxstr reduce sum shuffle);
16 $XS_VERSION = $VERSION;
17 $VERSION = eval $VERSION;
20 # PERL_DL_NONLAZY must be false, or any errors in loading will just
21 # cause the perl code to be tested
22 local $ENV{PERL_DL_NONLAZY} = 0 if $ENV{PERL_DL_NONLAZY};
25 XSLoader::load('List::Util', $XS_VERSION);
29 local @ISA = qw(DynaLoader);
30 bootstrap List::Util $XS_VERSION;
32 } unless $TESTING_PERL_ONLY;
35 # This code is only compiled if the XS did not load
38 if (!defined &reduce) {
45 return shift unless @_ > 1;
50 local(*{$caller."::a"}) = \my $a;
51 local(*{$caller."::b"}) = \my $b;
66 return $_ if &{$code}();
75 # This code is only compiled if the XS did not load
76 eval <<'ESQ' if !defined ∑
80 sub sum (@) { reduce { $a + $b } @_ }
82 sub min (@) { reduce { $a < $b ? $a : $b } @_ }
84 sub max (@) { reduce { $a > $b ? $a : $b } @_ }
86 sub minstr (@) { reduce { $a lt $b ? $a : $b } @_ }
88 sub maxstr (@) { reduce { $a gt $b ? $a : $b } @_ }
96 (${$a[$n]}, $a[$n] = $a[$i])[0];
108 List::Util - A selection of general-utility list subroutines
112 use List::Util qw(first max maxstr min minstr reduce shuffle sum);
116 C<List::Util> contains a selection of subroutines that people have
117 expressed would be nice to have in the perl core, but the usage would
118 not really be high enough to warrant the use of a keyword, and the size
119 so small such that being individual extensions would be wasteful.
121 By default C<List::Util> does not export any subroutines. The
122 subroutines defined are
126 =item first BLOCK LIST
128 Similar to C<grep> in that it evaluates BLOCK setting C<$_> to each element
129 of LIST in turn. C<first> returns the first element where the result from
130 BLOCK is a true value. If BLOCK never returns true or LIST was empty then
131 C<undef> is returned.
133 $foo = first { defined($_) } @list # first defined value in @list
134 $foo = first { $_ > $value } @list # first value in @list which
135 # is greater than $value
137 This function could be implemented using C<reduce> like this
139 $foo = reduce { defined($a) ? $a : wanted($b) ? $b : undef } undef, @list
141 for example wanted() could be defined() which would return the first
142 defined value in @list
146 Returns the entry in the list with the highest numerical value. If the
147 list is empty then C<undef> is returned.
149 $foo = max 1..10 # 10
150 $foo = max 3,9,12 # 12
151 $foo = max @bar, @baz # whatever
153 This function could be implemented using C<reduce> like this
155 $foo = reduce { $a > $b ? $a : $b } 1..10
159 Similar to C<max>, but treats all the entries in the list as strings
160 and returns the highest string as defined by the C<gt> operator.
161 If the list is empty then C<undef> is returned.
163 $foo = maxstr 'A'..'Z' # 'Z'
164 $foo = maxstr "hello","world" # "world"
165 $foo = maxstr @bar, @baz # whatever
167 This function could be implemented using C<reduce> like this
169 $foo = reduce { $a gt $b ? $a : $b } 'A'..'Z'
173 Similar to C<max> but returns the entry in the list with the lowest
174 numerical value. If the list is empty then C<undef> is returned.
177 $foo = min 3,9,12 # 3
178 $foo = min @bar, @baz # whatever
180 This function could be implemented using C<reduce> like this
182 $foo = reduce { $a < $b ? $a : $b } 1..10
186 Similar to C<min>, but treats all the entries in the list as strings
187 and returns the lowest string as defined by the C<lt> operator.
188 If the list is empty then C<undef> is returned.
190 $foo = minstr 'A'..'Z' # 'A'
191 $foo = minstr "hello","world" # "hello"
192 $foo = minstr @bar, @baz # whatever
194 This function could be implemented using C<reduce> like this
196 $foo = reduce { $a lt $b ? $a : $b } 'A'..'Z'
198 =item reduce BLOCK LIST
200 Reduces LIST by calling BLOCK, in a scalar context, multiple times,
201 setting C<$a> and C<$b> each time. The first call will be with C<$a>
202 and C<$b> set to the first two elements of the list, subsequent
203 calls will be done by setting C<$a> to the result of the previous
204 call and C<$b> to the next element in the list.
206 Returns the result of the last call to BLOCK. If LIST is empty then
207 C<undef> is returned. If LIST only contains one element then that
208 element is returned and BLOCK is not executed.
210 $foo = reduce { $a < $b ? $a : $b } 1..10 # min
211 $foo = reduce { $a lt $b ? $a : $b } 'aa'..'zz' # minstr
212 $foo = reduce { $a + $b } 1 .. 10 # sum
213 $foo = reduce { $a . $b } @bar # concat
217 Returns the elements of LIST in a random order
219 @cards = shuffle 0..51 # 0..51 in a random order
223 Returns the sum of all the elements in LIST. If LIST is empty then
224 C<undef> is returned.
226 $foo = sum 1..10 # 55
227 $foo = sum 3,9,12 # 24
228 $foo = sum @bar, @baz # whatever
230 This function could be implemented using C<reduce> like this
232 $foo = reduce { $a + $b } 1..10
238 With perl versions prior to 5.005 there are some cases where reduce
239 will return an incorrect result. This will show up as test 7 of
242 =head1 SUGGESTED ADDITIONS
244 The following are additions that have been requested, but I have been reluctant
245 to add due to them being very simple to implement in perl
247 # One argument is true
249 sub any { $_ && return 1 for @_; 0 }
251 # All arguments are true
253 sub all { $_ || return 0 for @_; 1 }
255 # All arguments are false
257 sub none { $_ && return 0 for @_; 1 }
259 # One argument is false
261 sub notall { $_ || return 1 for @_; 0 }
263 # How many elements are true
265 sub true { scalar grep { $_ } @_ }
267 # How many elements are false
269 sub false { scalar grep { !$_ } @_ }
273 L<Scalar::Util>, L<List::MoreUtils>
277 Copyright (c) 1997-2006 Graham Barr <gbarr@pobox.com>. All rights reserved.
278 This program is free software; you can redistribute it and/or
279 modify it under the same terms as Perl itself.