diff options
Diffstat (limited to 'upstream/mageia-cauldron/man3pm/List::Util.3pm')
-rw-r--r-- | upstream/mageia-cauldron/man3pm/List::Util.3pm | 942 |
1 files changed, 942 insertions, 0 deletions
diff --git a/upstream/mageia-cauldron/man3pm/List::Util.3pm b/upstream/mageia-cauldron/man3pm/List::Util.3pm new file mode 100644 index 00000000..f7b2740e --- /dev/null +++ b/upstream/mageia-cauldron/man3pm/List::Util.3pm @@ -0,0 +1,942 @@ +.\" -*- mode: troff; coding: utf-8 -*- +.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. +.ie n \{\ +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is >0, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{\ +. if \nF \{\ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{\ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" ======================================================================== +.\" +.IX Title "List::Util 3pm" +.TH List::Util 3pm 2023-11-28 "perl v5.38.2" "Perl Programmers Reference Guide" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH NAME +List::Util \- A selection of general\-utility list subroutines +.SH SYNOPSIS +.IX Header "SYNOPSIS" +.Vb 2 +\& use List::Util qw( +\& reduce any all none notall first reductions +\& +\& max maxstr min minstr product sum sum0 +\& +\& pairs unpairs pairkeys pairvalues pairfirst pairgrep pairmap +\& +\& shuffle uniq uniqint uniqnum uniqstr zip mesh +\& ); +.Ve +.SH DESCRIPTION +.IX Header "DESCRIPTION" +\&\f(CW\*(C`List::Util\*(C'\fR contains a selection of subroutines that people have expressed +would be nice to have in the perl core, but the usage would not really be high +enough to warrant the use of a keyword, and the size so small such that being +individual extensions would be wasteful. +.PP +By default \f(CW\*(C`List::Util\*(C'\fR does not export any subroutines. +.SH "LIST-REDUCTION FUNCTIONS" +.IX Header "LIST-REDUCTION FUNCTIONS" +The following set of functions all apply a given block of code to a list of +values. +.SS reduce +.IX Subsection "reduce" +.Vb 1 +\& $result = reduce { BLOCK } @list +.Ve +.PP +Reduces \f(CW@list\fR by calling \f(CW\*(C`BLOCK\*(C'\fR in a scalar context multiple times, +setting \f(CW$a\fR and \f(CW$b\fR each time. The first call will be with \f(CW$a\fR and \f(CW$b\fR +set to the first two elements of the list, subsequent calls will be done by +setting \f(CW$a\fR to the result of the previous call and \f(CW$b\fR to the next element +in the list. +.PP +Returns the result of the last call to the \f(CW\*(C`BLOCK\*(C'\fR. If \f(CW@list\fR is empty then +\&\f(CW\*(C`undef\*(C'\fR is returned. If \f(CW@list\fR only contains one element then that element +is returned and \f(CW\*(C`BLOCK\*(C'\fR is not executed. +.PP +The following examples all demonstrate how \f(CW\*(C`reduce\*(C'\fR could be used to implement +the other list-reduction functions in this module. (They are not in fact +implemented like this, but instead in a more efficient manner in individual C +functions). +.PP +.Vb 3 +\& $foo = reduce { defined($a) ? $a : +\& $code\->(local $_ = $b) ? $b : +\& undef } undef, @list # first +\& +\& $foo = reduce { $a > $b ? $a : $b } 1..10 # max +\& $foo = reduce { $a gt $b ? $a : $b } \*(AqA\*(Aq..\*(AqZ\*(Aq # maxstr +\& $foo = reduce { $a < $b ? $a : $b } 1..10 # min +\& $foo = reduce { $a lt $b ? $a : $b } \*(Aqaa\*(Aq..\*(Aqzz\*(Aq # minstr +\& $foo = reduce { $a + $b } 1 .. 10 # sum +\& $foo = reduce { $a . $b } @bar # concat +\& +\& $foo = reduce { $a || $code\->(local $_ = $b) } 0, @bar # any +\& $foo = reduce { $a && $code\->(local $_ = $b) } 1, @bar # all +\& $foo = reduce { $a && !$code\->(local $_ = $b) } 1, @bar # none +\& $foo = reduce { $a || !$code\->(local $_ = $b) } 0, @bar # notall +\& # Note that these implementations do not fully short\-circuit +.Ve +.PP +If your algorithm requires that \f(CW\*(C`reduce\*(C'\fR produce an identity value, then make +sure that you always pass that identity value as the first argument to prevent +\&\f(CW\*(C`undef\*(C'\fR being returned +.PP +.Vb 1 +\& $foo = reduce { $a + $b } 0, @values; # sum with 0 identity value +.Ve +.PP +The above example code blocks also suggest how to use \f(CW\*(C`reduce\*(C'\fR to build a +more efficient combined version of one of these basic functions and a \f(CW\*(C`map\*(C'\fR +block. For example, to find the total length of all the strings in a list, +we could use +.PP +.Vb 1 +\& $total = sum map { length } @strings; +.Ve +.PP +However, this produces a list of temporary integer values as long as the +original list of strings, only to reduce it down to a single value again. We +can compute the same result more efficiently by using \f(CW\*(C`reduce\*(C'\fR with a code +block that accumulates lengths by writing this instead as: +.PP +.Vb 1 +\& $total = reduce { $a + length $b } 0, @strings +.Ve +.PP +The other scalar-returning list reduction functions are all specialisations of +this generic idea. +.SS reductions +.IX Subsection "reductions" +.Vb 1 +\& @results = reductions { BLOCK } @list +.Ve +.PP +\&\fISince version 1.54.\fR +.PP +Similar to \f(CW\*(C`reduce\*(C'\fR except that it also returns the intermediate values along +with the final result. As before, \f(CW$a\fR is set to the first element of the +given list, and the \f(CW\*(C`BLOCK\*(C'\fR is then called once for remaining item in the +list set into \f(CW$b\fR, with the result being captured for return as well as +becoming the new value for \f(CW$a\fR. +.PP +The returned list will begin with the initial value for \f(CW$a\fR, followed by +each return value from the block in order. The final value of the result will +be identical to what the \f(CW\*(C`reduce\*(C'\fR function would have returned given the same +block and list. +.PP +.Vb 2 +\& reduce { "$a\-$b" } "a".."d" # "a\-b\-c\-d" +\& reductions { "$a\-$b" } "a".."d" # "a", "a\-b", "a\-b\-c", "a\-b\-c\-d" +.Ve +.SS any +.IX Subsection "any" +.Vb 1 +\& my $bool = any { BLOCK } @list; +.Ve +.PP +\&\fISince version 1.33.\fR +.PP +Similar to \f(CW\*(C`grep\*(C'\fR in that it evaluates \f(CW\*(C`BLOCK\*(C'\fR setting \f(CW$_\fR to each element +of \f(CW@list\fR in turn. \f(CW\*(C`any\*(C'\fR returns true if any element makes the \f(CW\*(C`BLOCK\*(C'\fR +return a true value. If \f(CW\*(C`BLOCK\*(C'\fR never returns true or \f(CW@list\fR was empty then +it returns false. +.PP +Many cases of using \f(CW\*(C`grep\*(C'\fR in a conditional can be written using \f(CW\*(C`any\*(C'\fR +instead, as it can short-circuit after the first true result. +.PP +.Vb 3 +\& if( any { length > 10 } @strings ) { +\& # at least one string has more than 10 characters +\& } +.Ve +.PP +Note: Due to XS issues the block passed may be able to access the outer \f(CW@_\fR +directly. This is not intentional and will break under debugger. +.SS all +.IX Subsection "all" +.Vb 1 +\& my $bool = all { BLOCK } @list; +.Ve +.PP +\&\fISince version 1.33.\fR +.PP +Similar to "any", except that it requires all elements of the \f(CW@list\fR to +make the \f(CW\*(C`BLOCK\*(C'\fR return true. If any element returns false, then it returns +false. If the \f(CW\*(C`BLOCK\*(C'\fR never returns false or the \f(CW@list\fR was empty then it +returns true. +.PP +Note: Due to XS issues the block passed may be able to access the outer \f(CW@_\fR +directly. This is not intentional and will break under debugger. +.SS none +.IX Subsection "none" +.SS notall +.IX Subsection "notall" +.Vb 1 +\& my $bool = none { BLOCK } @list; +\& +\& my $bool = notall { BLOCK } @list; +.Ve +.PP +\&\fISince version 1.33.\fR +.PP +Similar to "any" and "all", but with the return sense inverted. \f(CW\*(C`none\*(C'\fR +returns true only if no value in the \f(CW@list\fR causes the \f(CW\*(C`BLOCK\*(C'\fR to return +true, and \f(CW\*(C`notall\*(C'\fR returns true only if not all of the values do. +.PP +Note: Due to XS issues the block passed may be able to access the outer \f(CW@_\fR +directly. This is not intentional and will break under debugger. +.SS first +.IX Subsection "first" +.Vb 1 +\& my $val = first { BLOCK } @list; +.Ve +.PP +Similar to \f(CW\*(C`grep\*(C'\fR in that it evaluates \f(CW\*(C`BLOCK\*(C'\fR setting \f(CW$_\fR to each element +of \f(CW@list\fR in turn. \f(CW\*(C`first\*(C'\fR returns the first element where the result from +\&\f(CW\*(C`BLOCK\*(C'\fR is a true value. If \f(CW\*(C`BLOCK\*(C'\fR never returns true or \f(CW@list\fR was empty +then \f(CW\*(C`undef\*(C'\fR is returned. +.PP +.Vb 3 +\& $foo = first { defined($_) } @list # first defined value in @list +\& $foo = first { $_ > $value } @list # first value in @list which +\& # is greater than $value +.Ve +.SS max +.IX Subsection "max" +.Vb 1 +\& my $num = max @list; +.Ve +.PP +Returns the entry in the list with the highest numerical value. If the list is +empty then \f(CW\*(C`undef\*(C'\fR is returned. +.PP +.Vb 3 +\& $foo = max 1..10 # 10 +\& $foo = max 3,9,12 # 12 +\& $foo = max @bar, @baz # whatever +.Ve +.SS maxstr +.IX Subsection "maxstr" +.Vb 1 +\& my $str = maxstr @list; +.Ve +.PP +Similar to "max", but treats all the entries in the list as strings and +returns the highest string as defined by the \f(CW\*(C`gt\*(C'\fR operator. If the list is +empty then \f(CW\*(C`undef\*(C'\fR is returned. +.PP +.Vb 3 +\& $foo = maxstr \*(AqA\*(Aq..\*(AqZ\*(Aq # \*(AqZ\*(Aq +\& $foo = maxstr "hello","world" # "world" +\& $foo = maxstr @bar, @baz # whatever +.Ve +.SS min +.IX Subsection "min" +.Vb 1 +\& my $num = min @list; +.Ve +.PP +Similar to "max" but returns the entry in the list with the lowest numerical +value. If the list is empty then \f(CW\*(C`undef\*(C'\fR is returned. +.PP +.Vb 3 +\& $foo = min 1..10 # 1 +\& $foo = min 3,9,12 # 3 +\& $foo = min @bar, @baz # whatever +.Ve +.SS minstr +.IX Subsection "minstr" +.Vb 1 +\& my $str = minstr @list; +.Ve +.PP +Similar to "min", but treats all the entries in the list as strings and +returns the lowest string as defined by the \f(CW\*(C`lt\*(C'\fR operator. If the list is +empty then \f(CW\*(C`undef\*(C'\fR is returned. +.PP +.Vb 3 +\& $foo = minstr \*(AqA\*(Aq..\*(AqZ\*(Aq # \*(AqA\*(Aq +\& $foo = minstr "hello","world" # "hello" +\& $foo = minstr @bar, @baz # whatever +.Ve +.SS product +.IX Subsection "product" +.Vb 1 +\& my $num = product @list; +.Ve +.PP +\&\fISince version 1.35.\fR +.PP +Returns the numerical product of all the elements in \f(CW@list\fR. If \f(CW@list\fR is +empty then \f(CW1\fR is returned. +.PP +.Vb 2 +\& $foo = product 1..10 # 3628800 +\& $foo = product 3,9,12 # 324 +.Ve +.SS sum +.IX Subsection "sum" +.Vb 1 +\& my $num_or_undef = sum @list; +.Ve +.PP +Returns the numerical sum of all the elements in \f(CW@list\fR. For backwards +compatibility, if \f(CW@list\fR is empty then \f(CW\*(C`undef\*(C'\fR is returned. +.PP +.Vb 3 +\& $foo = sum 1..10 # 55 +\& $foo = sum 3,9,12 # 24 +\& $foo = sum @bar, @baz # whatever +.Ve +.SS sum0 +.IX Subsection "sum0" +.Vb 1 +\& my $num = sum0 @list; +.Ve +.PP +\&\fISince version 1.26.\fR +.PP +Similar to "sum", except this returns 0 when given an empty list, rather +than \f(CW\*(C`undef\*(C'\fR. +.SH "KEY/VALUE PAIR LIST FUNCTIONS" +.IX Header "KEY/VALUE PAIR LIST FUNCTIONS" +The following set of functions, all inspired by List::Pairwise, consume an +even-sized list of pairs. The pairs may be key/value associations from a hash, +or just a list of values. The functions will all preserve the original ordering +of the pairs, and will not be confused by multiple pairs having the same "key" +value \- nor even do they require that the first of each pair be a plain string. +.PP +\&\fBNOTE\fR: At the time of writing, the following \f(CW\*(C`pair*\*(C'\fR functions that take a +block do not modify the value of \f(CW$_\fR within the block, and instead operate +using the \f(CW$a\fR and \f(CW$b\fR globals instead. This has turned out to be a poor +design, as it precludes the ability to provide a \f(CW\*(C`pairsort\*(C'\fR function. Better +would be to pass pair-like objects as 2\-element array references in \f(CW$_\fR, in +a style similar to the return value of the \f(CW\*(C`pairs\*(C'\fR function. At some future +version this behaviour may be added. +.PP +Until then, users are alerted \fBNOT\fR to rely on the value of \f(CW$_\fR remaining +unmodified between the outside and the inside of the control block. In +particular, the following example is \fBUNSAFE\fR: +.PP +.Vb 1 +\& my @kvlist = ... +\& +\& foreach (qw( some keys here )) { +\& my @items = pairgrep { $a eq $_ } @kvlist; +\& ... +\& } +.Ve +.PP +Instead, write this using a lexical variable: +.PP +.Vb 4 +\& foreach my $key (qw( some keys here )) { +\& my @items = pairgrep { $a eq $key } @kvlist; +\& ... +\& } +.Ve +.SS pairs +.IX Subsection "pairs" +.Vb 1 +\& my @pairs = pairs @kvlist; +.Ve +.PP +\&\fISince version 1.29.\fR +.PP +A convenient shortcut to operating on even-sized lists of pairs, this function +returns a list of \f(CW\*(C`ARRAY\*(C'\fR references, each containing two items from the +given list. It is a more efficient version of +.PP +.Vb 1 +\& @pairs = pairmap { [ $a, $b ] } @kvlist +.Ve +.PP +It is most convenient to use in a \f(CW\*(C`foreach\*(C'\fR loop, for example: +.PP +.Vb 4 +\& foreach my $pair ( pairs @kvlist ) { +\& my ( $key, $value ) = @$pair; +\& ... +\& } +.Ve +.PP +Since version \f(CW1.39\fR these \f(CW\*(C`ARRAY\*(C'\fR references are blessed objects, +recognising the two methods \f(CW\*(C`key\*(C'\fR and \f(CW\*(C`value\*(C'\fR. The following code is +equivalent: +.PP +.Vb 5 +\& foreach my $pair ( pairs @kvlist ) { +\& my $key = $pair\->key; +\& my $value = $pair\->value; +\& ... +\& } +.Ve +.PP +Since version \f(CW1.51\fR they also have a \f(CW\*(C`TO_JSON\*(C'\fR method to ease +serialisation. +.SS unpairs +.IX Subsection "unpairs" +.Vb 1 +\& my @kvlist = unpairs @pairs +.Ve +.PP +\&\fISince version 1.42.\fR +.PP +The inverse function to \f(CW\*(C`pairs\*(C'\fR; this function takes a list of \f(CW\*(C`ARRAY\*(C'\fR +references containing two elements each, and returns a flattened list of the +two values from each of the pairs, in order. This is notionally equivalent to +.PP +.Vb 1 +\& my @kvlist = map { @{$_}[0,1] } @pairs +.Ve +.PP +except that it is implemented more efficiently internally. Specifically, for +any input item it will extract exactly two values for the output list; using +\&\f(CW\*(C`undef\*(C'\fR if the input array references are short. +.PP +Between \f(CW\*(C`pairs\*(C'\fR and \f(CW\*(C`unpairs\*(C'\fR, a higher-order list function can be used to +operate on the pairs as single scalars; such as the following near-equivalents +of the other \f(CW\*(C`pair*\*(C'\fR higher-order functions: +.PP +.Vb 2 +\& @kvlist = unpairs grep { FUNC } pairs @kvlist +\& # Like pairgrep, but takes $_ instead of $a and $b +\& +\& @kvlist = unpairs map { FUNC } pairs @kvlist +\& # Like pairmap, but takes $_ instead of $a and $b +.Ve +.PP +Note however that these versions will not behave as nicely in scalar context. +.PP +Finally, this technique can be used to implement a sort on a keyvalue pair +list; e.g.: +.PP +.Vb 1 +\& @kvlist = unpairs sort { $a\->key cmp $b\->key } pairs @kvlist +.Ve +.SS pairkeys +.IX Subsection "pairkeys" +.Vb 1 +\& my @keys = pairkeys @kvlist; +.Ve +.PP +\&\fISince version 1.29.\fR +.PP +A convenient shortcut to operating on even-sized lists of pairs, this function +returns a list of the the first values of each of the pairs in the given list. +It is a more efficient version of +.PP +.Vb 1 +\& @keys = pairmap { $a } @kvlist +.Ve +.SS pairvalues +.IX Subsection "pairvalues" +.Vb 1 +\& my @values = pairvalues @kvlist; +.Ve +.PP +\&\fISince version 1.29.\fR +.PP +A convenient shortcut to operating on even-sized lists of pairs, this function +returns a list of the the second values of each of the pairs in the given list. +It is a more efficient version of +.PP +.Vb 1 +\& @values = pairmap { $b } @kvlist +.Ve +.SS pairgrep +.IX Subsection "pairgrep" +.Vb 1 +\& my @kvlist = pairgrep { BLOCK } @kvlist; +\& +\& my $count = pairgrep { BLOCK } @kvlist; +.Ve +.PP +\&\fISince version 1.29.\fR +.PP +Similar to perl's \f(CW\*(C`grep\*(C'\fR keyword, but interprets the given list as an +even-sized list of pairs. It invokes the \f(CW\*(C`BLOCK\*(C'\fR multiple times, in scalar +context, with \f(CW$a\fR and \f(CW$b\fR set to successive pairs of values from the +\&\f(CW@kvlist\fR. +.PP +Returns an even-sized list of those pairs for which the \f(CW\*(C`BLOCK\*(C'\fR returned true +in list context, or the count of the \fBnumber of pairs\fR in scalar context. +(Note, therefore, in scalar context that it returns a number half the size of +the count of items it would have returned in list context). +.PP +.Vb 1 +\& @subset = pairgrep { $a =~ m/^[[:upper:]]+$/ } @kvlist +.Ve +.PP +As with \f(CW\*(C`grep\*(C'\fR aliasing \f(CW$_\fR to list elements, \f(CW\*(C`pairgrep\*(C'\fR aliases \f(CW$a\fR and +\&\f(CW$b\fR to elements of the given list. Any modifications of it by the code block +will be visible to the caller. +.SS pairfirst +.IX Subsection "pairfirst" +.Vb 1 +\& my ( $key, $val ) = pairfirst { BLOCK } @kvlist; +\& +\& my $found = pairfirst { BLOCK } @kvlist; +.Ve +.PP +\&\fISince version 1.30.\fR +.PP +Similar to the "first" function, but interprets the given list as an +even-sized list of pairs. It invokes the \f(CW\*(C`BLOCK\*(C'\fR multiple times, in scalar +context, with \f(CW$a\fR and \f(CW$b\fR set to successive pairs of values from the +\&\f(CW@kvlist\fR. +.PP +Returns the first pair of values from the list for which the \f(CW\*(C`BLOCK\*(C'\fR returned +true in list context, or an empty list of no such pair was found. In scalar +context it returns a simple boolean value, rather than either the key or the +value found. +.PP +.Vb 1 +\& ( $key, $value ) = pairfirst { $a =~ m/^[[:upper:]]+$/ } @kvlist +.Ve +.PP +As with \f(CW\*(C`grep\*(C'\fR aliasing \f(CW$_\fR to list elements, \f(CW\*(C`pairfirst\*(C'\fR aliases \f(CW$a\fR and +\&\f(CW$b\fR to elements of the given list. Any modifications of it by the code block +will be visible to the caller. +.SS pairmap +.IX Subsection "pairmap" +.Vb 1 +\& my @list = pairmap { BLOCK } @kvlist; +\& +\& my $count = pairmap { BLOCK } @kvlist; +.Ve +.PP +\&\fISince version 1.29.\fR +.PP +Similar to perl's \f(CW\*(C`map\*(C'\fR keyword, but interprets the given list as an +even-sized list of pairs. It invokes the \f(CW\*(C`BLOCK\*(C'\fR multiple times, in list +context, with \f(CW$a\fR and \f(CW$b\fR set to successive pairs of values from the +\&\f(CW@kvlist\fR. +.PP +Returns the concatenation of all the values returned by the \f(CW\*(C`BLOCK\*(C'\fR in list +context, or the count of the number of items that would have been returned in +scalar context. +.PP +.Vb 1 +\& @result = pairmap { "The key $a has value $b" } @kvlist +.Ve +.PP +As with \f(CW\*(C`map\*(C'\fR aliasing \f(CW$_\fR to list elements, \f(CW\*(C`pairmap\*(C'\fR aliases \f(CW$a\fR and +\&\f(CW$b\fR to elements of the given list. Any modifications of it by the code block +will be visible to the caller. +.PP +See "KNOWN BUGS" for a known-bug with \f(CW\*(C`pairmap\*(C'\fR, and a workaround. +.SH "OTHER FUNCTIONS" +.IX Header "OTHER FUNCTIONS" +.SS shuffle +.IX Subsection "shuffle" +.Vb 1 +\& my @values = shuffle @values; +.Ve +.PP +Returns the values of the input in a random order +.PP +.Vb 1 +\& @cards = shuffle 0..51 # 0..51 in a random order +.Ve +.PP +This function is affected by the \f(CW$RAND\fR variable. +.SS sample +.IX Subsection "sample" +.Vb 1 +\& my @items = sample $count, @values +.Ve +.PP +\&\fISince version 1.54.\fR +.PP +Randomly select the given number of elements from the input list. Any given +position in the input list will be selected at most once. +.PP +If there are fewer than \f(CW$count\fR items in the list then the function will +return once all of them have been randomly selected; effectively the function +behaves similarly to "shuffle". +.PP +This function is affected by the \f(CW$RAND\fR variable. +.SS uniq +.IX Subsection "uniq" +.Vb 1 +\& my @subset = uniq @values +.Ve +.PP +\&\fISince version 1.45.\fR +.PP +Filters a list of values to remove subsequent duplicates, as judged by a +DWIM-ish string equality or \f(CW\*(C`undef\*(C'\fR test. Preserves the order of unique +elements, and retains the first value of any duplicate set. +.PP +.Vb 1 +\& my $count = uniq @values +.Ve +.PP +In scalar context, returns the number of elements that would have been +returned as a list. +.PP +The \f(CW\*(C`undef\*(C'\fR value is treated by this function as distinct from the empty +string, and no warning will be produced. It is left as-is in the returned +list. Subsequent \f(CW\*(C`undef\*(C'\fR values are still considered identical to the first, +and will be removed. +.SS uniqint +.IX Subsection "uniqint" +.Vb 1 +\& my @subset = uniqint @values +.Ve +.PP +\&\fISince version 1.55.\fR +.PP +Filters a list of values to remove subsequent duplicates, as judged by an +integer numerical equality test. Preserves the order of unique elements, and +retains the first value of any duplicate set. Values in the returned list will +be coerced into integers. +.PP +.Vb 1 +\& my $count = uniqint @values +.Ve +.PP +In scalar context, returns the number of elements that would have been +returned as a list. +.PP +Note that \f(CW\*(C`undef\*(C'\fR is treated much as other numerical operations treat it; it +compares equal to zero but additionally produces a warning if such warnings +are enabled (\f(CW\*(C`use warnings \*(Aquninitialized\*(Aq;\*(C'\fR). In addition, an \f(CW\*(C`undef\*(C'\fR in +the returned list is coerced into a numerical zero, so that the entire list of +values returned by \f(CW\*(C`uniqint\*(C'\fR are well-behaved as integers. +.SS uniqnum +.IX Subsection "uniqnum" +.Vb 1 +\& my @subset = uniqnum @values +.Ve +.PP +\&\fISince version 1.44.\fR +.PP +Filters a list of values to remove subsequent duplicates, as judged by a +numerical equality test. Preserves the order of unique elements, and retains +the first value of any duplicate set. +.PP +.Vb 1 +\& my $count = uniqnum @values +.Ve +.PP +In scalar context, returns the number of elements that would have been +returned as a list. +.PP +Note that \f(CW\*(C`undef\*(C'\fR is treated much as other numerical operations treat it; it +compares equal to zero but additionally produces a warning if such warnings +are enabled (\f(CW\*(C`use warnings \*(Aquninitialized\*(Aq;\*(C'\fR). In addition, an \f(CW\*(C`undef\*(C'\fR in +the returned list is coerced into a numerical zero, so that the entire list of +values returned by \f(CW\*(C`uniqnum\*(C'\fR are well-behaved as numbers. +.PP +Note also that multiple IEEE \f(CW\*(C`NaN\*(C'\fR values are treated as duplicates of +each other, regardless of any differences in their payloads, and despite +the fact that \f(CW\*(C`0+\*(AqNaN\*(Aq == 0+\*(AqNaN\*(Aq\*(C'\fR yields false. +.SS uniqstr +.IX Subsection "uniqstr" +.Vb 1 +\& my @subset = uniqstr @values +.Ve +.PP +\&\fISince version 1.45.\fR +.PP +Filters a list of values to remove subsequent duplicates, as judged by a +string equality test. Preserves the order of unique elements, and retains the +first value of any duplicate set. +.PP +.Vb 1 +\& my $count = uniqstr @values +.Ve +.PP +In scalar context, returns the number of elements that would have been +returned as a list. +.PP +Note that \f(CW\*(C`undef\*(C'\fR is treated much as other string operations treat it; it +compares equal to the empty string but additionally produces a warning if such +warnings are enabled (\f(CW\*(C`use warnings \*(Aquninitialized\*(Aq;\*(C'\fR). In addition, an +\&\f(CW\*(C`undef\*(C'\fR in the returned list is coerced into an empty string, so that the +entire list of values returned by \f(CW\*(C`uniqstr\*(C'\fR are well-behaved as strings. +.SS head +.IX Subsection "head" +.Vb 1 +\& my @values = head $size, @list; +.Ve +.PP +\&\fISince version 1.50.\fR +.PP +Returns the first \f(CW$size\fR elements from \f(CW@list\fR. If \f(CW$size\fR is negative, returns +all but the last \f(CW$size\fR elements from \f(CW@list\fR. +.PP +.Vb 2 +\& @result = head 2, qw( foo bar baz ); +\& # foo, bar +\& +\& @result = head \-2, qw( foo bar baz ); +\& # foo +.Ve +.SS tail +.IX Subsection "tail" +.Vb 1 +\& my @values = tail $size, @list; +.Ve +.PP +\&\fISince version 1.50.\fR +.PP +Returns the last \f(CW$size\fR elements from \f(CW@list\fR. If \f(CW$size\fR is negative, returns +all but the first \f(CW$size\fR elements from \f(CW@list\fR. +.PP +.Vb 2 +\& @result = tail 2, qw( foo bar baz ); +\& # bar, baz +\& +\& @result = tail \-2, qw( foo bar baz ); +\& # baz +.Ve +.SS zip +.IX Subsection "zip" +.Vb 2 +\& my @result = zip [1..3], [\*(Aqa\*(Aq..\*(Aqc\*(Aq]; +\& # [1, \*(Aqa\*(Aq], [2, \*(Aqb\*(Aq], [3, \*(Aqc\*(Aq] +.Ve +.PP +\&\fISince version 1.56.\fR +.PP +Returns a list of array references, composed of elements from the given list +of array references. Each array in the returned list is composed of elements +at that corresponding position from each of the given input arrays. If any +input arrays run out of elements before others, then \f(CW\*(C`undef\*(C'\fR will be inserted +into the result to fill in the gaps. +.PP +The \f(CW\*(C`zip\*(C'\fR function is particularly handy for iterating over multiple arrays +at the same time with a \f(CW\*(C`foreach\*(C'\fR loop, taking one element from each: +.PP +.Vb 4 +\& foreach ( zip \e@xs, \e@ys, \e@zs ) { +\& my ($x, $y, $z) = @$_; +\& ... +\& } +.Ve +.PP +\&\fBNOTE\fR to users of List::MoreUtils: This function does not behave the same +as \f(CW\*(C`List::MoreUtils::zip\*(C'\fR, but is actually a non-prototyped equivalent to +\&\f(CW\*(C`List::MoreUtils::zip_unflatten\*(C'\fR. This function does not apply a prototype, +so make sure to invoke it with references to arrays. +.PP +For a function similar to the \f(CW\*(C`zip\*(C'\fR function from \f(CW\*(C`List::MoreUtils\*(C'\fR, see +mesh. +.PP +.Vb 1 +\& my @result = zip_shortest ... +.Ve +.PP +A variation of the function that differs in how it behaves when given input +arrays of differing lengths. \f(CW\*(C`zip_shortest\*(C'\fR will stop as soon as any one of +the input arrays run out of elements, discarding any remaining unused values +from the others. +.PP +.Vb 1 +\& my @result = zip_longest ... +.Ve +.PP +\&\f(CW\*(C`zip_longest\*(C'\fR is an alias to the \f(CW\*(C`zip\*(C'\fR function, provided simply to be +explicit about that behaviour as compared to \f(CW\*(C`zip_shortest\*(C'\fR. +.SS mesh +.IX Subsection "mesh" +.Vb 2 +\& my @result = mesh [1..3], [\*(Aqa\*(Aq..\*(Aqc\*(Aq]; +\& # (1, \*(Aqa\*(Aq, 2, \*(Aqb\*(Aq, 3, \*(Aqc\*(Aq) +.Ve +.PP +\&\fISince version 1.56.\fR +.PP +Returns a list of items collected from elements of the given list of array +references. Each section of items in the returned list is composed of elements +at the corresponding position from each of the given input arrays. If any +input arrays run out of elements before others, then \f(CW\*(C`undef\*(C'\fR will be inserted +into the result to fill in the gaps. +.PP +This is similar to zip, except that all of the ranges in the result are +returned in one long flattened list, instead of being bundled into separate +arrays. +.PP +Because it returns a flat list of items, the \f(CW\*(C`mesh\*(C'\fR function is particularly +useful for building a hash out of two separate arrays of keys and values: +.PP +.Vb 1 +\& my %hash = mesh \e@keys, \e@values; +\& +\& my $href = { mesh \e@keys, \e@values }; +.Ve +.PP +\&\fBNOTE\fR to users of List::MoreUtils: This function is a non-prototyped +equivalent to \f(CW\*(C`List::MoreUtils::mesh\*(C'\fR or \f(CW\*(C`List::MoreUtils::zip\*(C'\fR (themselves +aliases of each other). This function does not apply a prototype, so make sure +to invoke it with references to arrays. +.PP +.Vb 1 +\& my @result = mesh_shortest ... +\& +\& my @result = mesh_longest ... +.Ve +.PP +These variations are similar to those of zip, in that they differ in +behaviour when one of the input lists runs out of elements before the others. +.SH "CONFIGURATION VARIABLES" +.IX Header "CONFIGURATION VARIABLES" +.ie n .SS $RAND +.el .SS \f(CW$RAND\fP +.IX Subsection "$RAND" +.Vb 1 +\& local $List::Util::RAND = sub { ... }; +.Ve +.PP +\&\fISince version 1.54.\fR +.PP +This package variable is used by code which needs to generate random numbers +(such as the "shuffle" and "sample" functions). If set to a CODE reference +it provides an alternative to perl's builtin \f(CWrand()\fR function. When a new +random number is needed this function will be invoked with no arguments and is +expected to return a floating-point value, of which only the fractional part +will be used. +.SH "KNOWN BUGS" +.IX Header "KNOWN BUGS" +.SS "RT #95409" +.IX Subsection "RT #95409" +<https://rt.cpan.org/Ticket/Display.html?id=95409> +.PP +If the block of code given to "pairmap" contains lexical variables that are +captured by a returned closure, and the closure is executed after the block +has been re-used for the next iteration, these lexicals will not see the +correct values. For example: +.PP +.Vb 4 +\& my @subs = pairmap { +\& my $var = "$a is $b"; +\& sub { print "$var\en" }; +\& } one => 1, two => 2, three => 3; +\& +\& $_\->() for @subs; +.Ve +.PP +Will incorrectly print +.PP +.Vb 3 +\& three is 3 +\& three is 3 +\& three is 3 +.Ve +.PP +This is due to the performance optimisation of using \f(CW\*(C`MULTICALL\*(C'\fR for the code +block, which means that fresh SVs do not get allocated for each call to the +block. Instead, the same SV is re-assigned for each iteration, and all the +closures will share the value seen on the final iteration. +.PP +To work around this bug, surround the code with a second set of braces. This +creates an inner block that defeats the \f(CW\*(C`MULTICALL\*(C'\fR logic, and does get fresh +SVs allocated each time: +.PP +.Vb 6 +\& my @subs = pairmap { +\& { +\& my $var = "$a is $b"; +\& sub { print "$var\en"; } +\& } +\& } one => 1, two => 2, three => 3; +.Ve +.PP +This bug only affects closures that are generated by the block but used +afterwards. Lexical variables that are only used during the lifetime of the +block's execution will take their individual values for each invocation, as +normal. +.SS "\fBuniqnum()\fP on oversized bignums" +.IX Subsection "uniqnum() on oversized bignums" +Due to the way that \f(CWuniqnum()\fR compares numbers, it cannot distinguish +differences between bignums (especially bigints) that are too large to fit in +the native platform types. For example, +.PP +.Vb 2 +\& my $x = Math::BigInt\->new( "1" x 100 ); +\& my $y = $x + 1; +\& +\& say for uniqnum( $x, $y ); +.Ve +.PP +Will print just the value of \f(CW$x\fR, believing that \f(CW$y\fR is a numerically\- +equivalent value. This bug does not affect \f(CWuniqstr()\fR, which will correctly +observe that the two values stringify to different strings. +.SH "SUGGESTED ADDITIONS" +.IX Header "SUGGESTED ADDITIONS" +The following are additions that have been requested, but I have been reluctant +to add due to them being very simple to implement in perl +.PP +.Vb 1 +\& # How many elements are true +\& +\& sub true { scalar grep { $_ } @_ } +\& +\& # How many elements are false +\& +\& sub false { scalar grep { !$_ } @_ } +.Ve +.SH "SEE ALSO" +.IX Header "SEE ALSO" +Scalar::Util, List::MoreUtils +.SH COPYRIGHT +.IX Header "COPYRIGHT" +Copyright (c) 1997\-2007 Graham Barr <gbarr@pobox.com>. All rights reserved. +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. +.PP +Recent additions and current maintenance by +Paul Evans, <leonerd@leonerd.org.uk>. |