Revision 67978a2d
Von Moritz Bunkus vor mehr als 10 Jahren hinzugefügt
SL/InstallationCheck.pm | ||
---|---|---|
34 | 34 |
{ name => "Image::Info", url => "http://search.cpan.org/~srezic/", debian => 'libimage-info-perl' }, |
35 | 35 |
{ name => "JSON", url => "http://search.cpan.org/~makamaka", debian => 'libjson-perl' }, |
36 | 36 |
{ name => "List::MoreUtils", version => '0.21', url => "http://search.cpan.org/~vparseval/", debian => 'liblist-moreutils-perl' }, |
37 |
{ name => "List::UtilsBy", url => "http://search.cpan.org/~pevans/", debian => 'liblist-utilsby-perl' }, |
|
37 | 38 |
{ name => "Params::Validate", url => "http://search.cpan.org/~drolsky/", debian => 'libparams-validate-perl' }, |
38 | 39 |
{ name => "PDF::API2", version => '2.000', url => "http://search.cpan.org/~areibens/", debian => 'libpdf-api2-perl' }, |
39 | 40 |
{ name => "Rose::Object", url => "http://search.cpan.org/~jsiracusa/", debian => 'librose-object-perl' }, |
doc/modules/LICENSE.List-UtilsBy | ||
---|---|---|
1 |
This software is copyright (c) 2012 by Paul Evans <leonerd@leonerd.org.uk>. |
|
2 |
|
|
3 |
This is free software; you can redistribute it and/or modify it under |
|
4 |
the same terms as the Perl 5 programming language system itself. |
|
5 |
|
|
6 |
Terms of the Perl programming language system itself |
|
7 |
|
|
8 |
a) the GNU General Public License as published by the Free |
|
9 |
Software Foundation; either version 1, or (at your option) any |
|
10 |
later version, or |
|
11 |
b) the "Artistic License" |
|
12 |
|
|
13 |
--- The GNU General Public License, Version 1, February 1989 --- |
|
14 |
|
|
15 |
This software is Copyright (c) 2012 by Paul Evans <leonerd@leonerd.org.uk>. |
|
16 |
|
|
17 |
This is free software, licensed under: |
|
18 |
|
|
19 |
The GNU General Public License, Version 1, February 1989 |
|
20 |
|
|
21 |
GNU GENERAL PUBLIC LICENSE |
|
22 |
Version 1, February 1989 |
|
23 |
|
|
24 |
Copyright (C) 1989 Free Software Foundation, Inc. |
|
25 |
51 Franklin St, Suite 500, Boston, MA 02110-1335 USA |
|
26 |
|
|
27 |
Everyone is permitted to copy and distribute verbatim copies |
|
28 |
of this license document, but changing it is not allowed. |
|
29 |
|
|
30 |
Preamble |
|
31 |
|
|
32 |
The license agreements of most software companies try to keep users |
|
33 |
at the mercy of those companies. By contrast, our General Public |
|
34 |
License is intended to guarantee your freedom to share and change free |
|
35 |
software--to make sure the software is free for all its users. The |
|
36 |
General Public License applies to the Free Software Foundation's |
|
37 |
software and to any other program whose authors commit to using it. |
|
38 |
You can use it for your programs, too. |
|
39 |
|
|
40 |
When we speak of free software, we are referring to freedom, not |
|
41 |
price. Specifically, the General Public License is designed to make |
|
42 |
sure that you have the freedom to give away or sell copies of free |
|
43 |
software, that you receive source code or can get it if you want it, |
|
44 |
that you can change the software or use pieces of it in new free |
|
45 |
programs; and that you know you can do these things. |
|
46 |
|
|
47 |
To protect your rights, we need to make restrictions that forbid |
|
48 |
anyone to deny you these rights or to ask you to surrender the rights. |
|
49 |
These restrictions translate to certain responsibilities for you if you |
|
50 |
distribute copies of the software, or if you modify it. |
|
51 |
|
|
52 |
For example, if you distribute copies of a such a program, whether |
|
53 |
gratis or for a fee, you must give the recipients all the rights that |
|
54 |
you have. You must make sure that they, too, receive or can get the |
|
55 |
source code. And you must tell them their rights. |
|
56 |
|
|
57 |
We protect your rights with two steps: (1) copyright the software, and |
|
58 |
(2) offer you this license which gives you legal permission to copy, |
|
59 |
distribute and/or modify the software. |
|
60 |
|
|
61 |
Also, for each author's protection and ours, we want to make certain |
|
62 |
that everyone understands that there is no warranty for this free |
|
63 |
software. If the software is modified by someone else and passed on, we |
|
64 |
want its recipients to know that what they have is not the original, so |
|
65 |
that any problems introduced by others will not reflect on the original |
|
66 |
authors' reputations. |
|
67 |
|
|
68 |
The precise terms and conditions for copying, distribution and |
|
69 |
modification follow. |
|
70 |
|
|
71 |
GNU GENERAL PUBLIC LICENSE |
|
72 |
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION |
|
73 |
|
|
74 |
0. This License Agreement applies to any program or other work which |
|
75 |
contains a notice placed by the copyright holder saying it may be |
|
76 |
distributed under the terms of this General Public License. The |
|
77 |
"Program", below, refers to any such program or work, and a "work based |
|
78 |
on the Program" means either the Program or any work containing the |
|
79 |
Program or a portion of it, either verbatim or with modifications. Each |
|
80 |
licensee is addressed as "you". |
|
81 |
|
|
82 |
1. You may copy and distribute verbatim copies of the Program's source |
|
83 |
code as you receive it, in any medium, provided that you conspicuously and |
|
84 |
appropriately publish on each copy an appropriate copyright notice and |
|
85 |
disclaimer of warranty; keep intact all the notices that refer to this |
|
86 |
General Public License and to the absence of any warranty; and give any |
|
87 |
other recipients of the Program a copy of this General Public License |
|
88 |
along with the Program. You may charge a fee for the physical act of |
|
89 |
transferring a copy. |
|
90 |
|
|
91 |
2. You may modify your copy or copies of the Program or any portion of |
|
92 |
it, and copy and distribute such modifications under the terms of Paragraph |
|
93 |
1 above, provided that you also do the following: |
|
94 |
|
|
95 |
a) cause the modified files to carry prominent notices stating that |
|
96 |
you changed the files and the date of any change; and |
|
97 |
|
|
98 |
b) cause the whole of any work that you distribute or publish, that |
|
99 |
in whole or in part contains the Program or any part thereof, either |
|
100 |
with or without modifications, to be licensed at no charge to all |
|
101 |
third parties under the terms of this General Public License (except |
|
102 |
that you may choose to grant warranty protection to some or all |
|
103 |
third parties, at your option). |
|
104 |
|
|
105 |
c) If the modified program normally reads commands interactively when |
|
106 |
run, you must cause it, when started running for such interactive use |
|
107 |
in the simplest and most usual way, to print or display an |
|
108 |
announcement including an appropriate copyright notice and a notice |
|
109 |
that there is no warranty (or else, saying that you provide a |
|
110 |
warranty) and that users may redistribute the program under these |
|
111 |
conditions, and telling the user how to view a copy of this General |
|
112 |
Public License. |
|
113 |
|
|
114 |
d) You may charge a fee for the physical act of transferring a |
|
115 |
copy, and you may at your option offer warranty protection in |
|
116 |
exchange for a fee. |
|
117 |
|
|
118 |
Mere aggregation of another independent work with the Program (or its |
|
119 |
derivative) on a volume of a storage or distribution medium does not bring |
|
120 |
the other work under the scope of these terms. |
|
121 |
|
|
122 |
3. You may copy and distribute the Program (or a portion or derivative of |
|
123 |
it, under Paragraph 2) in object code or executable form under the terms of |
|
124 |
Paragraphs 1 and 2 above provided that you also do one of the following: |
|
125 |
|
|
126 |
a) accompany it with the complete corresponding machine-readable |
|
127 |
source code, which must be distributed under the terms of |
|
128 |
Paragraphs 1 and 2 above; or, |
|
129 |
|
|
130 |
b) accompany it with a written offer, valid for at least three |
|
131 |
years, to give any third party free (except for a nominal charge |
|
132 |
for the cost of distribution) a complete machine-readable copy of the |
|
133 |
corresponding source code, to be distributed under the terms of |
|
134 |
Paragraphs 1 and 2 above; or, |
|
135 |
|
|
136 |
c) accompany it with the information you received as to where the |
|
137 |
corresponding source code may be obtained. (This alternative is |
|
138 |
allowed only for noncommercial distribution and only if you |
|
139 |
received the program in object code or executable form alone.) |
|
140 |
|
|
141 |
Source code for a work means the preferred form of the work for making |
|
142 |
modifications to it. For an executable file, complete source code means |
|
143 |
all the source code for all modules it contains; but, as a special |
|
144 |
exception, it need not include source code for modules which are standard |
|
145 |
libraries that accompany the operating system on which the executable |
|
146 |
file runs, or for standard header files or definitions files that |
|
147 |
accompany that operating system. |
|
148 |
|
|
149 |
4. You may not copy, modify, sublicense, distribute or transfer the |
|
150 |
Program except as expressly provided under this General Public License. |
|
151 |
Any attempt otherwise to copy, modify, sublicense, distribute or transfer |
|
152 |
the Program is void, and will automatically terminate your rights to use |
|
153 |
the Program under this License. However, parties who have received |
|
154 |
copies, or rights to use copies, from you under this General Public |
|
155 |
License will not have their licenses terminated so long as such parties |
|
156 |
remain in full compliance. |
|
157 |
|
|
158 |
5. By copying, distributing or modifying the Program (or any work based |
|
159 |
on the Program) you indicate your acceptance of this license to do so, |
|
160 |
and all its terms and conditions. |
|
161 |
|
|
162 |
6. Each time you redistribute the Program (or any work based on the |
|
163 |
Program), the recipient automatically receives a license from the original |
|
164 |
licensor to copy, distribute or modify the Program subject to these |
|
165 |
terms and conditions. You may not impose any further restrictions on the |
|
166 |
recipients' exercise of the rights granted herein. |
|
167 |
|
|
168 |
7. The Free Software Foundation may publish revised and/or new versions |
|
169 |
of the General Public License from time to time. Such new versions will |
|
170 |
be similar in spirit to the present version, but may differ in detail to |
|
171 |
address new problems or concerns. |
|
172 |
|
|
173 |
Each version is given a distinguishing version number. If the Program |
|
174 |
specifies a version number of the license which applies to it and "any |
|
175 |
later version", you have the option of following the terms and conditions |
|
176 |
either of that version or of any later version published by the Free |
|
177 |
Software Foundation. If the Program does not specify a version number of |
|
178 |
the license, you may choose any version ever published by the Free Software |
|
179 |
Foundation. |
|
180 |
|
|
181 |
8. If you wish to incorporate parts of the Program into other free |
|
182 |
programs whose distribution conditions are different, write to the author |
|
183 |
to ask for permission. For software which is copyrighted by the Free |
|
184 |
Software Foundation, write to the Free Software Foundation; we sometimes |
|
185 |
make exceptions for this. Our decision will be guided by the two goals |
|
186 |
of preserving the free status of all derivatives of our free software and |
|
187 |
of promoting the sharing and reuse of software generally. |
|
188 |
|
|
189 |
NO WARRANTY |
|
190 |
|
|
191 |
9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY |
|
192 |
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN |
|
193 |
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES |
|
194 |
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED |
|
195 |
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF |
|
196 |
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS |
|
197 |
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE |
|
198 |
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, |
|
199 |
REPAIR OR CORRECTION. |
|
200 |
|
|
201 |
10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
|
202 |
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR |
|
203 |
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, |
|
204 |
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING |
|
205 |
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED |
|
206 |
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY |
|
207 |
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER |
|
208 |
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE |
|
209 |
POSSIBILITY OF SUCH DAMAGES. |
|
210 |
|
|
211 |
END OF TERMS AND CONDITIONS |
|
212 |
|
|
213 |
Appendix: How to Apply These Terms to Your New Programs |
|
214 |
|
|
215 |
If you develop a new program, and you want it to be of the greatest |
|
216 |
possible use to humanity, the best way to achieve this is to make it |
|
217 |
free software which everyone can redistribute and change under these |
|
218 |
terms. |
|
219 |
|
|
220 |
To do so, attach the following notices to the program. It is safest to |
|
221 |
attach them to the start of each source file to most effectively convey |
|
222 |
the exclusion of warranty; and each file should have at least the |
|
223 |
"copyright" line and a pointer to where the full notice is found. |
|
224 |
|
|
225 |
<one line to give the program's name and a brief idea of what it does.> |
|
226 |
Copyright (C) 19yy <name of author> |
|
227 |
|
|
228 |
This program is free software; you can redistribute it and/or modify |
|
229 |
it under the terms of the GNU General Public License as published by |
|
230 |
the Free Software Foundation; either version 1, or (at your option) |
|
231 |
any later version. |
|
232 |
|
|
233 |
This program is distributed in the hope that it will be useful, |
|
234 |
but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
235 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
236 |
GNU General Public License for more details. |
|
237 |
|
|
238 |
You should have received a copy of the GNU General Public License |
|
239 |
along with this program; if not, write to the Free Software |
|
240 |
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA |
|
241 |
|
|
242 |
|
|
243 |
Also add information on how to contact you by electronic and paper mail. |
|
244 |
|
|
245 |
If the program is interactive, make it output a short notice like this |
|
246 |
when it starts in an interactive mode: |
|
247 |
|
|
248 |
Gnomovision version 69, Copyright (C) 19xx name of author |
|
249 |
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. |
|
250 |
This is free software, and you are welcome to redistribute it |
|
251 |
under certain conditions; type `show c' for details. |
|
252 |
|
|
253 |
The hypothetical commands `show w' and `show c' should show the |
|
254 |
appropriate parts of the General Public License. Of course, the |
|
255 |
commands you use may be called something other than `show w' and `show |
|
256 |
c'; they could even be mouse-clicks or menu items--whatever suits your |
|
257 |
program. |
|
258 |
|
|
259 |
You should also get your employer (if you work as a programmer) or your |
|
260 |
school, if any, to sign a "copyright disclaimer" for the program, if |
|
261 |
necessary. Here a sample; alter the names: |
|
262 |
|
|
263 |
Yoyodyne, Inc., hereby disclaims all copyright interest in the |
|
264 |
program `Gnomovision' (a program to direct compilers to make passes |
|
265 |
at assemblers) written by James Hacker. |
|
266 |
|
|
267 |
<signature of Ty Coon>, 1 April 1989 |
|
268 |
Ty Coon, President of Vice |
|
269 |
|
|
270 |
That's all there is to it! |
|
271 |
|
|
272 |
|
|
273 |
--- The Artistic License 1.0 --- |
|
274 |
|
|
275 |
This software is Copyright (c) 2012 by Paul Evans <leonerd@leonerd.org.uk>. |
|
276 |
|
|
277 |
This is free software, licensed under: |
|
278 |
|
|
279 |
The Artistic License 1.0 |
|
280 |
|
|
281 |
The Artistic License |
|
282 |
|
|
283 |
Preamble |
|
284 |
|
|
285 |
The intent of this document is to state the conditions under which a Package |
|
286 |
may be copied, such that the Copyright Holder maintains some semblance of |
|
287 |
artistic control over the development of the package, while giving the users of |
|
288 |
the package the right to use and distribute the Package in a more-or-less |
|
289 |
customary fashion, plus the right to make reasonable modifications. |
|
290 |
|
|
291 |
Definitions: |
|
292 |
|
|
293 |
- "Package" refers to the collection of files distributed by the Copyright |
|
294 |
Holder, and derivatives of that collection of files created through |
|
295 |
textual modification. |
|
296 |
- "Standard Version" refers to such a Package if it has not been modified, |
|
297 |
or has been modified in accordance with the wishes of the Copyright |
|
298 |
Holder. |
|
299 |
- "Copyright Holder" is whoever is named in the copyright or copyrights for |
|
300 |
the package. |
|
301 |
- "You" is you, if you're thinking about copying or distributing this Package. |
|
302 |
- "Reasonable copying fee" is whatever you can justify on the basis of media |
|
303 |
cost, duplication charges, time of people involved, and so on. (You will |
|
304 |
not be required to justify it to the Copyright Holder, but only to the |
|
305 |
computing community at large as a market that must bear the fee.) |
|
306 |
- "Freely Available" means that no fee is charged for the item itself, though |
|
307 |
there may be fees involved in handling the item. It also means that |
|
308 |
recipients of the item may redistribute it under the same conditions they |
|
309 |
received it. |
|
310 |
|
|
311 |
1. You may make and give away verbatim copies of the source form of the |
|
312 |
Standard Version of this Package without restriction, provided that you |
|
313 |
duplicate all of the original copyright notices and associated disclaimers. |
|
314 |
|
|
315 |
2. You may apply bug fixes, portability fixes and other modifications derived |
|
316 |
from the Public Domain or from the Copyright Holder. A Package modified in such |
|
317 |
a way shall still be considered the Standard Version. |
|
318 |
|
|
319 |
3. You may otherwise modify your copy of this Package in any way, provided that |
|
320 |
you insert a prominent notice in each changed file stating how and when you |
|
321 |
changed that file, and provided that you do at least ONE of the following: |
|
322 |
|
|
323 |
a) place your modifications in the Public Domain or otherwise make them |
|
324 |
Freely Available, such as by posting said modifications to Usenet or an |
|
325 |
equivalent medium, or placing the modifications on a major archive site |
|
326 |
such as ftp.uu.net, or by allowing the Copyright Holder to include your |
|
327 |
modifications in the Standard Version of the Package. |
|
328 |
|
|
329 |
b) use the modified Package only within your corporation or organization. |
|
330 |
|
|
331 |
c) rename any non-standard executables so the names do not conflict with |
|
332 |
standard executables, which must also be provided, and provide a separate |
|
333 |
manual page for each non-standard executable that clearly documents how it |
|
334 |
differs from the Standard Version. |
|
335 |
|
|
336 |
d) make other distribution arrangements with the Copyright Holder. |
|
337 |
|
|
338 |
4. You may distribute the programs of this Package in object code or executable |
|
339 |
form, provided that you do at least ONE of the following: |
|
340 |
|
|
341 |
a) distribute a Standard Version of the executables and library files, |
|
342 |
together with instructions (in the manual page or equivalent) on where to |
|
343 |
get the Standard Version. |
|
344 |
|
|
345 |
b) accompany the distribution with the machine-readable source of the Package |
|
346 |
with your modifications. |
|
347 |
|
|
348 |
c) accompany any non-standard executables with their corresponding Standard |
|
349 |
Version executables, giving the non-standard executables non-standard |
|
350 |
names, and clearly documenting the differences in manual pages (or |
|
351 |
equivalent), together with instructions on where to get the Standard |
|
352 |
Version. |
|
353 |
|
|
354 |
d) make other distribution arrangements with the Copyright Holder. |
|
355 |
|
|
356 |
5. You may charge a reasonable copying fee for any distribution of this |
|
357 |
Package. You may charge any fee you choose for support of this Package. You |
|
358 |
may not charge a fee for this Package itself. However, you may distribute this |
|
359 |
Package in aggregate with other (possibly commercial) programs as part of a |
|
360 |
larger (possibly commercial) software distribution provided that you do not |
|
361 |
advertise this Package as a product of your own. |
|
362 |
|
|
363 |
6. The scripts and library files supplied as input to or produced as output |
|
364 |
from the programs of this Package do not automatically fall under the copyright |
|
365 |
of this Package, but belong to whomever generated them, and may be sold |
|
366 |
commercially, and may be aggregated with this Package. |
|
367 |
|
|
368 |
7. C or perl subroutines supplied by you and linked into this Package shall not |
|
369 |
be considered part of this Package. |
|
370 |
|
|
371 |
8. The name of the Copyright Holder may not be used to endorse or promote |
|
372 |
products derived from this software without specific prior written permission. |
|
373 |
|
|
374 |
9. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED |
|
375 |
WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF |
|
376 |
MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. |
|
377 |
|
|
378 |
The End |
doc/modules/README.List-UtilsBy | ||
---|---|---|
1 |
NAME |
|
2 |
`List::UtilsBy' - higher-order list utility functions |
|
3 |
|
|
4 |
SYNOPSIS |
|
5 |
use List::UtilsBy qw( nsort_by min_by ); |
|
6 |
|
|
7 |
use File::stat qw( stat ); |
|
8 |
my @files_by_age = nsort_by { stat($_)->mtime } @files; |
|
9 |
|
|
10 |
my $shortest_name = min_by { length } @names; |
|
11 |
|
|
12 |
DESCRIPTION |
|
13 |
This module provides a number of list utility functions, all of which |
|
14 |
take an initial code block to control their behaviour. They are |
|
15 |
variations on similar core perl or `List::Util' functions of similar |
|
16 |
names, but which use the block to control their behaviour. For example, |
|
17 |
the core Perl function `sort' takes a list of values and returns them, |
|
18 |
sorted into order by their string value. The `sort_by' function sorts |
|
19 |
them according to the string value returned by the extra function, when |
|
20 |
given each value. |
|
21 |
|
|
22 |
my @names_sorted = sort @names; |
|
23 |
|
|
24 |
my @people_sorted = sort_by { $_->name } @people; |
|
25 |
|
|
26 |
FUNCTIONS |
|
27 |
@vals = sort_by { KEYFUNC } @vals |
|
28 |
Returns the list of values sorted according to the string values |
|
29 |
returned by the `KEYFUNC' block or function. A typical use of this may |
|
30 |
be to sort objects according to the string value of some accessor, such |
|
31 |
as |
|
32 |
|
|
33 |
sort_by { $_->name } @people |
|
34 |
|
|
35 |
The key function is called in scalar context, being passed each value in |
|
36 |
turn as both `$_' and the only argument in the parameters, `@_'. The |
|
37 |
values are then sorted according to string comparisons on the values |
|
38 |
returned. |
|
39 |
|
|
40 |
This is equivalent to |
|
41 |
|
|
42 |
sort { $a->name cmp $b->name } @people |
|
43 |
|
|
44 |
except that it guarantees the `name' accessor will be executed only once |
|
45 |
per value. |
|
46 |
|
|
47 |
One interesting use-case is to sort strings which may have numbers |
|
48 |
embedded in them "naturally", rather than lexically. |
|
49 |
|
|
50 |
sort_by { s/(\d+)/sprintf "%09d", $1/eg; $_ } @strings |
|
51 |
|
|
52 |
This sorts strings by generating sort keys which zero-pad the embedded |
|
53 |
numbers to some level (9 digits in this case), helping to ensure the |
|
54 |
lexical sort puts them in the correct order. |
|
55 |
|
|
56 |
@vals = nsort_by { KEYFUNC } @vals |
|
57 |
Similar to `sort_by' but compares its key values numerically. |
|
58 |
|
|
59 |
@vals = rev_sort_by { KEYFUNC } @vals |
|
60 |
@vals = rev_nsort_by { KEYFUNC } @vals |
|
61 |
Similar to `sort_by' and `nsort_by' but returns the list in the reverse |
|
62 |
order. Equivalent to |
|
63 |
|
|
64 |
@vals = reverse sort_by { KEYFUNC } @vals |
|
65 |
|
|
66 |
except that these functions are slightly more efficient because they |
|
67 |
avoid the final `reverse' operation. |
|
68 |
|
|
69 |
$optimal = max_by { KEYFUNC } @vals |
|
70 |
@optimal = max_by { KEYFUNC } @vals |
|
71 |
Returns the (first) value from `@vals' that gives the numerically |
|
72 |
largest result from the key function. |
|
73 |
|
|
74 |
my $tallest = max_by { $_->height } @people |
|
75 |
|
|
76 |
use File::stat qw( stat ); |
|
77 |
my $newest = max_by { stat($_)->mtime } @files; |
|
78 |
|
|
79 |
In scalar context, the first maximal value is returned. In list context, |
|
80 |
a list of all the maximal values is returned. This may be used to obtain |
|
81 |
positions other than the first, if order is significant. |
|
82 |
|
|
83 |
If called on an empty list, an empty list is returned. |
|
84 |
|
|
85 |
For symmetry with the `nsort_by' function, this is also provided under |
|
86 |
the name `nmax_by' since it behaves numerically. |
|
87 |
|
|
88 |
$optimal = min_by { KEYFUNC } @vals |
|
89 |
@optimal = min_by { KEYFUNC } @vals |
|
90 |
Similar to `max_by' but returns values which give the numerically |
|
91 |
smallest result from the key function. Also provided as `nmin_by' |
|
92 |
|
|
93 |
@vals = uniq_by { KEYFUNC } @vals |
|
94 |
Returns a list of the subset of values for which the key function block |
|
95 |
returns unique values. The first value yielding a particular key is |
|
96 |
chosen, subsequent values are rejected. |
|
97 |
|
|
98 |
my @some_fruit = uniq_by { $_->colour } @fruit; |
|
99 |
|
|
100 |
To select instead the last value per key, reverse the input list. If the |
|
101 |
order of the results is significant, don't forget to reverse the result |
|
102 |
as well: |
|
103 |
|
|
104 |
my @some_fruit = reverse uniq_by { $_->colour } reverse @fruit; |
|
105 |
|
|
106 |
%parts = partition_by { KEYFUNC } @vals |
|
107 |
Returns a key/value list of ARRAY refs containing all the original |
|
108 |
values distributed according to the result of the key function block. |
|
109 |
Each value will be an ARRAY ref containing all the values which returned |
|
110 |
the string from the key function, in their original order. |
|
111 |
|
|
112 |
my %balls_by_colour = partition_by { $_->colour } @balls; |
|
113 |
|
|
114 |
Because the values returned by the key function are used as hash keys, |
|
115 |
they ought to either be strings, or at least well-behaved as strings |
|
116 |
(such as numbers, or object references which overload stringification in |
|
117 |
a suitable manner). |
|
118 |
|
|
119 |
%counts = count_by { KEYFUNC } @vals |
|
120 |
Returns a key/value list of integers, giving the number of times the key |
|
121 |
function block returned the key, for each value in the list. |
|
122 |
|
|
123 |
my %count_of_balls = count_by { $_->colour } @balls; |
|
124 |
|
|
125 |
Because the values returned by the key function are used as hash keys, |
|
126 |
they ought to either be strings, or at least well-behaved as strings |
|
127 |
(such as numbers, or object references which overload stringification in |
|
128 |
a suitable manner). |
|
129 |
|
|
130 |
@vals = zip_by { ITEMFUNC } \@arr0, \@arr1, \@arr2,... |
|
131 |
Returns a list of each of the values returned by the function block, |
|
132 |
when invoked with values from across each each of the given ARRAY |
|
133 |
references. Each value in the returned list will be the result of the |
|
134 |
function having been invoked with arguments at that position, from |
|
135 |
across each of the arrays given. |
|
136 |
|
|
137 |
my @transposition = zip_by { [ @_ ] } @matrix; |
|
138 |
|
|
139 |
my @names = zip_by { "$_[1], $_[0]" } \@firstnames, \@surnames; |
|
140 |
|
|
141 |
print zip_by { "$_[0] => $_[1]\n" } [ keys %hash ], [ values %hash ]; |
|
142 |
|
|
143 |
If some of the arrays are shorter than others, the function will behave |
|
144 |
as if they had `undef' in the trailing positions. The following two |
|
145 |
lines are equivalent: |
|
146 |
|
|
147 |
zip_by { f(@_) } [ 1, 2, 3 ], [ "a", "b" ] |
|
148 |
f( 1, "a" ), f( 2, "b" ), f( 3, undef ) |
|
149 |
|
|
150 |
The item function is called by `map', so if it returns a list, the |
|
151 |
entire list is included in the result. This can be useful for example, |
|
152 |
for generating a hash from two separate lists of keys and values |
|
153 |
|
|
154 |
my %nums = zip_by { @_ } [qw( one two three )], [ 1, 2, 3 ]; |
|
155 |
# %nums = ( one => 1, two => 2, three => 3 ) |
|
156 |
|
|
157 |
(A function having this behaviour is sometimes called `zipWith', e.g. in |
|
158 |
Haskell, but that name would not fit the naming scheme used by this |
|
159 |
module). |
|
160 |
|
|
161 |
$arr0, $arr1, $arr2, ... = unzip_by { ITEMFUNC } @vals |
|
162 |
Returns a list of ARRAY references containing the values returned by the |
|
163 |
function block, when invoked for each of the values given in the input |
|
164 |
list. Each of the returned ARRAY references will contain the values |
|
165 |
returned at that corresponding position by the function block. That is, |
|
166 |
the first returned ARRAY reference will contain all the values returned |
|
167 |
in the first position by the function block, the second will contain all |
|
168 |
the values from the second position, and so on. |
|
169 |
|
|
170 |
my ( $firstnames, $lastnames ) = unzip_by { m/^(.*?) (.*)$/ } @names; |
|
171 |
|
|
172 |
If the function returns lists of differing lengths, the result will be |
|
173 |
padded with `undef' in the missing elements. |
|
174 |
|
|
175 |
This function is an inverse of `zip_by', if given a corresponding |
|
176 |
inverse function. |
|
177 |
|
|
178 |
@vals = extract_by { SELECTFUNC } @arr |
|
179 |
Removes elements from the referenced array on which the selection |
|
180 |
function returns true, and returns a list containing those elements. |
|
181 |
This function is similar to `grep', except that it modifies the |
|
182 |
referenced array to remove the selected values from it, leaving only the |
|
183 |
unselected ones. |
|
184 |
|
|
185 |
my @red_balls = extract_by { $_->color eq "red" } @balls; |
|
186 |
|
|
187 |
# Now there are no red balls in the @balls array |
|
188 |
|
|
189 |
This function modifies a real array, unlike most of the other functions |
|
190 |
in this module. Because of this, it requires a real array, not just a |
|
191 |
list. |
|
192 |
|
|
193 |
This function is implemented by invoking `splice()' on the array, not by |
|
194 |
constructing a new list and assigning it. One result of this is that |
|
195 |
weak references will not be disturbed. |
|
196 |
|
|
197 |
extract_by { !defined $_ } @refs; |
|
198 |
|
|
199 |
will leave weak references weakened in the `@refs' array, whereas |
|
200 |
|
|
201 |
@refs = grep { defined $_ } @refs; |
|
202 |
|
|
203 |
will strengthen them all again. |
|
204 |
|
|
205 |
@vals = weighted_shuffle_by { WEIGHTFUNC } @vals |
|
206 |
Returns the list of values shuffled into a random order. The |
|
207 |
randomisation is not uniform, but weighted by the value returned by the |
|
208 |
`WEIGHTFUNC'. The probabilty of each item being returned first will be |
|
209 |
distributed with the distribution of the weights, and so on recursively |
|
210 |
for the remaining items. |
|
211 |
|
|
212 |
@vals = bundle_by { BLOCKFUNC } $number, @vals |
|
213 |
Similar to a regular `map' functional, returns a list of the values |
|
214 |
returned by `BLOCKFUNC'. Values from the input list are given to the |
|
215 |
block function in bundles of `$number'. |
|
216 |
|
|
217 |
If given a list of values whose length does not evenly divide by |
|
218 |
`$number', the final call will be passed fewer elements than the others. |
|
219 |
|
|
220 |
TODO |
|
221 |
* XS implementations |
|
222 |
These functions are currently all written in pure perl. Some at |
|
223 |
least, may benefit from having XS implementations to speed up their |
|
224 |
logic. |
|
225 |
|
|
226 |
* Merge into List::Util or List::MoreUtils |
|
227 |
This module shouldn't really exist. The functions should instead be |
|
228 |
part of one of the existing modules that already contain many list |
|
229 |
utility functions. Having Yet Another List Utilty Module just |
|
230 |
worsens the problem. |
|
231 |
|
|
232 |
I have attempted to contact the authors of both of the above |
|
233 |
modules, to no avail; therefore I decided it best to write and |
|
234 |
release this code here anyway so that it is at least on CPAN. Once |
|
235 |
there, we can then see how best to merge it into an existing module. |
|
236 |
|
|
237 |
AUTHOR |
|
238 |
Paul Evans <leonerd@leonerd.org.uk> |
modules/fallback/List/UtilsBy.pm | ||
---|---|---|
1 |
# You may distribute under the terms of either the GNU General Public License |
|
2 |
# or the Artistic License (the same terms as Perl itself) |
|
3 |
# |
|
4 |
# (C) Paul Evans, 2009-2012 -- leonerd@leonerd.org.uk |
|
5 |
|
|
6 |
package List::UtilsBy; |
|
7 |
|
|
8 |
use strict; |
|
9 |
use warnings; |
|
10 |
|
|
11 |
our $VERSION = '0.09'; |
|
12 |
|
|
13 |
use Exporter 'import'; |
|
14 |
|
|
15 |
our @EXPORT_OK = qw( |
|
16 |
sort_by |
|
17 |
nsort_by |
|
18 |
rev_sort_by |
|
19 |
rev_nsort_by |
|
20 |
|
|
21 |
max_by nmax_by |
|
22 |
min_by nmin_by |
|
23 |
|
|
24 |
uniq_by |
|
25 |
|
|
26 |
partition_by |
|
27 |
count_by |
|
28 |
|
|
29 |
zip_by |
|
30 |
unzip_by |
|
31 |
|
|
32 |
extract_by |
|
33 |
|
|
34 |
weighted_shuffle_by |
|
35 |
|
|
36 |
bundle_by |
|
37 |
); |
|
38 |
|
|
39 |
=head1 NAME |
|
40 |
|
|
41 |
C<List::UtilsBy> - higher-order list utility functions |
|
42 |
|
|
43 |
=head1 SYNOPSIS |
|
44 |
|
|
45 |
use List::UtilsBy qw( nsort_by min_by ); |
|
46 |
|
|
47 |
use File::stat qw( stat ); |
|
48 |
my @files_by_age = nsort_by { stat($_)->mtime } @files; |
|
49 |
|
|
50 |
my $shortest_name = min_by { length } @names; |
|
51 |
|
|
52 |
=head1 DESCRIPTION |
|
53 |
|
|
54 |
This module provides a number of list utility functions, all of which take an |
|
55 |
initial code block to control their behaviour. They are variations on similar |
|
56 |
core perl or C<List::Util> functions of similar names, but which use the block |
|
57 |
to control their behaviour. For example, the core Perl function C<sort> takes |
|
58 |
a list of values and returns them, sorted into order by their string value. |
|
59 |
The C<sort_by> function sorts them according to the string value returned by |
|
60 |
the extra function, when given each value. |
|
61 |
|
|
62 |
my @names_sorted = sort @names; |
|
63 |
|
|
64 |
my @people_sorted = sort_by { $_->name } @people; |
|
65 |
|
|
66 |
=cut |
|
67 |
|
|
68 |
=head1 FUNCTIONS |
|
69 |
|
|
70 |
=cut |
|
71 |
|
|
72 |
=head2 @vals = sort_by { KEYFUNC } @vals |
|
73 |
|
|
74 |
Returns the list of values sorted according to the string values returned by |
|
75 |
the C<KEYFUNC> block or function. A typical use of this may be to sort objects |
|
76 |
according to the string value of some accessor, such as |
|
77 |
|
|
78 |
sort_by { $_->name } @people |
|
79 |
|
|
80 |
The key function is called in scalar context, being passed each value in turn |
|
81 |
as both C<$_> and the only argument in the parameters, C<@_>. The values are |
|
82 |
then sorted according to string comparisons on the values returned. |
|
83 |
|
|
84 |
This is equivalent to |
|
85 |
|
|
86 |
sort { $a->name cmp $b->name } @people |
|
87 |
|
|
88 |
except that it guarantees the C<name> accessor will be executed only once per |
|
89 |
value. |
|
90 |
|
|
91 |
One interesting use-case is to sort strings which may have numbers embedded in |
|
92 |
them "naturally", rather than lexically. |
|
93 |
|
|
94 |
sort_by { s/(\d+)/sprintf "%09d", $1/eg; $_ } @strings |
|
95 |
|
|
96 |
This sorts strings by generating sort keys which zero-pad the embedded numbers |
|
97 |
to some level (9 digits in this case), helping to ensure the lexical sort puts |
|
98 |
them in the correct order. |
|
99 |
|
|
100 |
=cut |
|
101 |
|
|
102 |
sub sort_by(&@) |
|
103 |
{ |
|
104 |
my $keygen = shift; |
|
105 |
|
|
106 |
my @keys = map { local $_ = $_; scalar $keygen->( $_ ) } @_; |
|
107 |
return @_[ sort { $keys[$a] cmp $keys[$b] } 0 .. $#_ ]; |
|
108 |
} |
|
109 |
|
|
110 |
=head2 @vals = nsort_by { KEYFUNC } @vals |
|
111 |
|
|
112 |
Similar to C<sort_by> but compares its key values numerically. |
|
113 |
|
|
114 |
=cut |
|
115 |
|
|
116 |
sub nsort_by(&@) |
|
117 |
{ |
|
118 |
my $keygen = shift; |
|
119 |
|
|
120 |
my @keys = map { local $_ = $_; scalar $keygen->( $_ ) } @_; |
|
121 |
return @_[ sort { $keys[$a] <=> $keys[$b] } 0 .. $#_ ]; |
|
122 |
} |
|
123 |
|
|
124 |
=head2 @vals = rev_sort_by { KEYFUNC } @vals |
|
125 |
|
|
126 |
=head2 @vals = rev_nsort_by { KEYFUNC } @vals |
|
127 |
|
|
128 |
Similar to C<sort_by> and C<nsort_by> but returns the list in the reverse |
|
129 |
order. Equivalent to |
|
130 |
|
|
131 |
@vals = reverse sort_by { KEYFUNC } @vals |
|
132 |
|
|
133 |
except that these functions are slightly more efficient because they avoid |
|
134 |
the final C<reverse> operation. |
|
135 |
|
|
136 |
=cut |
|
137 |
|
|
138 |
sub rev_sort_by(&@) |
|
139 |
{ |
|
140 |
my $keygen = shift; |
|
141 |
|
|
142 |
my @keys = map { local $_ = $_; scalar $keygen->( $_ ) } @_; |
|
143 |
return @_[ sort { $keys[$b] cmp $keys[$a] } 0 .. $#_ ]; |
|
144 |
} |
|
145 |
|
|
146 |
sub rev_nsort_by(&@) |
|
147 |
{ |
|
148 |
my $keygen = shift; |
|
149 |
|
|
150 |
my @keys = map { local $_ = $_; scalar $keygen->( $_ ) } @_; |
|
151 |
return @_[ sort { $keys[$b] <=> $keys[$a] } 0 .. $#_ ]; |
|
152 |
} |
|
153 |
|
|
154 |
=head2 $optimal = max_by { KEYFUNC } @vals |
|
155 |
|
|
156 |
=head2 @optimal = max_by { KEYFUNC } @vals |
|
157 |
|
|
158 |
Returns the (first) value from C<@vals> that gives the numerically largest |
|
159 |
result from the key function. |
|
160 |
|
|
161 |
my $tallest = max_by { $_->height } @people |
|
162 |
|
|
163 |
use File::stat qw( stat ); |
|
164 |
my $newest = max_by { stat($_)->mtime } @files; |
|
165 |
|
|
166 |
In scalar context, the first maximal value is returned. In list context, a |
|
167 |
list of all the maximal values is returned. This may be used to obtain |
|
168 |
positions other than the first, if order is significant. |
|
169 |
|
|
170 |
If called on an empty list, an empty list is returned. |
|
171 |
|
|
172 |
For symmetry with the C<nsort_by> function, this is also provided under the |
|
173 |
name C<nmax_by> since it behaves numerically. |
|
174 |
|
|
175 |
=cut |
|
176 |
|
|
177 |
sub max_by(&@) |
|
178 |
{ |
|
179 |
my $code = shift; |
|
180 |
|
|
181 |
return unless @_; |
|
182 |
|
|
183 |
local $_; |
|
184 |
|
|
185 |
my @maximal = $_ = shift @_; |
|
186 |
my $max = $code->( $_ ); |
|
187 |
|
|
188 |
foreach ( @_ ) { |
|
189 |
my $this = $code->( $_ ); |
|
190 |
if( $this > $max ) { |
|
191 |
@maximal = $_; |
|
192 |
$max = $this; |
|
193 |
} |
|
194 |
elsif( wantarray and $this == $max ) { |
|
195 |
push @maximal, $_; |
|
196 |
} |
|
197 |
} |
|
198 |
|
|
199 |
return wantarray ? @maximal : $maximal[0]; |
|
200 |
} |
|
201 |
|
|
202 |
*nmax_by = \&max_by; |
|
203 |
|
|
204 |
=head2 $optimal = min_by { KEYFUNC } @vals |
|
205 |
|
|
206 |
=head2 @optimal = min_by { KEYFUNC } @vals |
|
207 |
|
|
208 |
Similar to C<max_by> but returns values which give the numerically smallest |
|
209 |
result from the key function. Also provided as C<nmin_by> |
|
210 |
|
|
211 |
=cut |
|
212 |
|
|
213 |
sub min_by(&@) |
|
214 |
{ |
|
215 |
my $code = shift; |
|
216 |
|
|
217 |
return unless @_; |
|
218 |
|
|
219 |
local $_; |
|
220 |
|
|
221 |
my @minimal = $_ = shift @_; |
|
222 |
my $min = $code->( $_ ); |
|
223 |
|
|
224 |
foreach ( @_ ) { |
|
225 |
my $this = $code->( $_ ); |
|
226 |
if( $this < $min ) { |
|
227 |
@minimal = $_; |
|
228 |
$min = $this; |
|
229 |
} |
|
230 |
elsif( wantarray and $this == $min ) { |
|
231 |
push @minimal, $_; |
|
232 |
} |
|
233 |
} |
|
234 |
|
|
235 |
return wantarray ? @minimal : $minimal[0]; |
|
236 |
} |
|
237 |
|
|
238 |
*nmin_by = \&min_by; |
|
239 |
|
|
240 |
=head2 @vals = uniq_by { KEYFUNC } @vals |
|
241 |
|
|
242 |
Returns a list of the subset of values for which the key function block |
|
243 |
returns unique values. The first value yielding a particular key is chosen, |
|
244 |
subsequent values are rejected. |
|
245 |
|
|
246 |
my @some_fruit = uniq_by { $_->colour } @fruit; |
|
247 |
|
|
248 |
To select instead the last value per key, reverse the input list. If the order |
|
249 |
of the results is significant, don't forget to reverse the result as well: |
|
250 |
|
|
251 |
my @some_fruit = reverse uniq_by { $_->colour } reverse @fruit; |
|
252 |
|
|
253 |
=cut |
|
254 |
|
|
255 |
sub uniq_by(&@) |
|
256 |
{ |
|
257 |
my $code = shift; |
|
258 |
|
|
259 |
my %present; |
|
260 |
return grep { |
|
261 |
my $key = $code->( local $_ = $_ ); |
|
262 |
!$present{$key}++ |
|
263 |
} @_; |
|
264 |
} |
|
265 |
|
|
266 |
=head2 %parts = partition_by { KEYFUNC } @vals |
|
267 |
|
|
268 |
Returns a key/value list of ARRAY refs containing all the original values |
|
269 |
distributed according to the result of the key function block. Each value will |
|
270 |
be an ARRAY ref containing all the values which returned the string from the |
|
271 |
key function, in their original order. |
|
272 |
|
|
273 |
my %balls_by_colour = partition_by { $_->colour } @balls; |
|
274 |
|
|
275 |
Because the values returned by the key function are used as hash keys, they |
|
276 |
ought to either be strings, or at least well-behaved as strings (such as |
|
277 |
numbers, or object references which overload stringification in a suitable |
|
278 |
manner). |
|
279 |
|
|
280 |
=cut |
|
281 |
|
|
282 |
sub partition_by(&@) |
|
283 |
{ |
|
284 |
my $code = shift; |
|
285 |
|
|
286 |
my %parts; |
|
287 |
push @{ $parts{ $code->( local $_ = $_ ) } }, $_ for @_; |
|
288 |
|
|
289 |
return %parts; |
|
290 |
} |
|
291 |
|
|
292 |
=head2 %counts = count_by { KEYFUNC } @vals |
|
293 |
|
|
294 |
Returns a key/value list of integers, giving the number of times the key |
|
295 |
function block returned the key, for each value in the list. |
|
296 |
|
|
297 |
my %count_of_balls = count_by { $_->colour } @balls; |
|
298 |
|
|
299 |
Because the values returned by the key function are used as hash keys, they |
|
300 |
ought to either be strings, or at least well-behaved as strings (such as |
|
301 |
numbers, or object references which overload stringification in a suitable |
|
302 |
manner). |
|
303 |
|
|
304 |
=cut |
|
305 |
|
|
306 |
sub count_by(&@) |
|
307 |
{ |
|
308 |
my $code = shift; |
|
309 |
|
|
310 |
my %counts; |
|
311 |
$counts{ $code->( local $_ = $_ ) }++ for @_; |
|
312 |
|
|
313 |
return %counts; |
|
314 |
} |
|
315 |
|
|
316 |
=head2 @vals = zip_by { ITEMFUNC } \@arr0, \@arr1, \@arr2,... |
|
317 |
|
|
318 |
Returns a list of each of the values returned by the function block, when |
|
319 |
invoked with values from across each each of the given ARRAY references. Each |
|
320 |
value in the returned list will be the result of the function having been |
|
321 |
invoked with arguments at that position, from across each of the arrays given. |
|
322 |
|
|
323 |
my @transposition = zip_by { [ @_ ] } @matrix; |
|
324 |
|
|
325 |
my @names = zip_by { "$_[1], $_[0]" } \@firstnames, \@surnames; |
|
326 |
|
|
327 |
print zip_by { "$_[0] => $_[1]\n" } [ keys %hash ], [ values %hash ]; |
|
328 |
|
|
329 |
If some of the arrays are shorter than others, the function will behave as if |
|
330 |
they had C<undef> in the trailing positions. The following two lines are |
|
331 |
equivalent: |
|
332 |
|
|
333 |
zip_by { f(@_) } [ 1, 2, 3 ], [ "a", "b" ] |
|
334 |
f( 1, "a" ), f( 2, "b" ), f( 3, undef ) |
|
335 |
|
|
336 |
The item function is called by C<map>, so if it returns a list, the entire |
|
337 |
list is included in the result. This can be useful for example, for generating |
|
338 |
a hash from two separate lists of keys and values |
|
339 |
|
|
340 |
my %nums = zip_by { @_ } [qw( one two three )], [ 1, 2, 3 ]; |
|
341 |
# %nums = ( one => 1, two => 2, three => 3 ) |
|
342 |
|
|
343 |
(A function having this behaviour is sometimes called C<zipWith>, e.g. in |
|
344 |
Haskell, but that name would not fit the naming scheme used by this module). |
|
345 |
|
|
346 |
=cut |
|
347 |
|
|
348 |
sub zip_by(&@) |
|
349 |
{ |
|
350 |
my $code = shift; |
|
351 |
|
|
352 |
@_ or return; |
|
353 |
|
|
354 |
my $len = 0; |
|
355 |
scalar @$_ > $len and $len = scalar @$_ for @_; |
|
356 |
|
|
357 |
return map { |
|
358 |
my $idx = $_; |
|
359 |
$code->( map { $_[$_][$idx] } 0 .. $#_ ) |
|
360 |
} 0 .. $len-1; |
|
361 |
} |
|
362 |
|
|
363 |
=head2 $arr0, $arr1, $arr2, ... = unzip_by { ITEMFUNC } @vals |
|
364 |
|
|
365 |
Returns a list of ARRAY references containing the values returned by the |
|
366 |
function block, when invoked for each of the values given in the input list. |
|
367 |
Each of the returned ARRAY references will contain the values returned at that |
|
368 |
corresponding position by the function block. That is, the first returned |
|
369 |
ARRAY reference will contain all the values returned in the first position by |
|
370 |
the function block, the second will contain all the values from the second |
|
371 |
position, and so on. |
|
372 |
|
|
373 |
my ( $firstnames, $lastnames ) = unzip_by { m/^(.*?) (.*)$/ } @names; |
|
374 |
|
|
375 |
If the function returns lists of differing lengths, the result will be padded |
|
376 |
with C<undef> in the missing elements. |
|
377 |
|
|
378 |
This function is an inverse of C<zip_by>, if given a corresponding inverse |
|
379 |
function. |
|
380 |
|
|
381 |
=cut |
|
382 |
|
|
383 |
sub unzip_by(&@) |
|
384 |
{ |
|
385 |
my $code = shift; |
|
386 |
|
|
387 |
my @ret; |
|
388 |
foreach my $idx ( 0 .. $#_ ) { |
|
389 |
my @slice = $code->( local $_ = $_[$idx] ); |
|
390 |
$#slice = $#ret if @slice < @ret; |
|
391 |
$ret[$_][$idx] = $slice[$_] for 0 .. $#slice; |
|
392 |
} |
|
393 |
|
|
394 |
return @ret; |
|
395 |
} |
|
396 |
|
|
397 |
=head2 @vals = extract_by { SELECTFUNC } @arr |
|
398 |
|
|
399 |
Removes elements from the referenced array on which the selection function |
|
400 |
returns true, and returns a list containing those elements. This function is |
|
401 |
similar to C<grep>, except that it modifies the referenced array to remove the |
|
402 |
selected values from it, leaving only the unselected ones. |
|
403 |
|
|
404 |
my @red_balls = extract_by { $_->color eq "red" } @balls; |
|
405 |
|
|
406 |
# Now there are no red balls in the @balls array |
|
407 |
|
|
408 |
This function modifies a real array, unlike most of the other functions in this |
|
409 |
module. Because of this, it requires a real array, not just a list. |
|
410 |
|
|
411 |
This function is implemented by invoking C<splice()> on the array, not by |
|
412 |
constructing a new list and assigning it. One result of this is that weak |
|
413 |
references will not be disturbed. |
|
414 |
|
|
415 |
extract_by { !defined $_ } @refs; |
|
416 |
|
|
417 |
will leave weak references weakened in the C<@refs> array, whereas |
|
418 |
|
|
419 |
@refs = grep { defined $_ } @refs; |
|
420 |
|
|
421 |
will strengthen them all again. |
|
422 |
|
|
423 |
=cut |
|
424 |
|
|
425 |
sub extract_by(&\@) |
|
426 |
{ |
|
427 |
my $code = shift; |
|
428 |
my ( $arrref ) = @_; |
|
429 |
|
|
430 |
my @ret; |
|
431 |
for( my $idx = 0; $idx < scalar @$arrref; ) { |
|
432 |
if( $code->( local $_ = $arrref->[$idx] ) ) { |
|
433 |
push @ret, splice @$arrref, $idx, 1, (); |
|
434 |
} |
|
435 |
else { |
|
436 |
$idx++; |
|
437 |
} |
|
438 |
} |
|
439 |
|
|
440 |
return @ret; |
|
441 |
} |
|
442 |
|
|
443 |
=head2 @vals = weighted_shuffle_by { WEIGHTFUNC } @vals |
|
444 |
|
|
445 |
Returns the list of values shuffled into a random order. The randomisation is |
|
446 |
not uniform, but weighted by the value returned by the C<WEIGHTFUNC>. The |
|
447 |
probabilty of each item being returned first will be distributed with the |
|
448 |
distribution of the weights, and so on recursively for the remaining items. |
|
449 |
|
|
450 |
=cut |
|
451 |
|
|
452 |
sub weighted_shuffle_by(&@) |
|
453 |
{ |
|
454 |
my $code = shift; |
|
455 |
my @vals = @_; |
|
456 |
|
|
457 |
my @weights = map { $code->( local $_ = $_ ) } @vals; |
|
458 |
|
|
459 |
my @ret; |
|
460 |
while( @vals > 1 ) { |
|
461 |
my $total = 0; $total += $_ for @weights; |
|
462 |
my $select = int rand $total; |
|
463 |
my $idx = 0; |
|
464 |
while( $select >= $weights[$idx] ) { |
|
465 |
$select -= $weights[$idx++]; |
|
466 |
} |
|
467 |
|
|
468 |
push @ret, splice @vals, $idx, 1, (); |
|
469 |
splice @weights, $idx, 1, (); |
|
470 |
} |
|
471 |
|
|
472 |
push @ret, @vals if @vals; |
|
473 |
|
|
474 |
return @ret; |
|
475 |
} |
|
476 |
|
|
477 |
=head2 @vals = bundle_by { BLOCKFUNC } $number, @vals |
|
478 |
|
|
479 |
Similar to a regular C<map> functional, returns a list of the values returned |
|
480 |
by C<BLOCKFUNC>. Values from the input list are given to the block function in |
|
481 |
bundles of C<$number>. |
|
482 |
|
|
483 |
If given a list of values whose length does not evenly divide by C<$number>, |
|
484 |
the final call will be passed fewer elements than the others. |
|
485 |
|
|
486 |
=cut |
|
487 |
|
|
488 |
sub bundle_by(&@) |
|
489 |
{ |
|
490 |
my $code = shift; |
|
491 |
my $n = shift; |
|
492 |
|
|
493 |
my @ret; |
|
494 |
for( my ( $pos, $next ) = ( 0, $n ); $pos < @_; $pos = $next, $next += $n ) { |
|
495 |
$next = @_ if $next > @_; |
|
496 |
push @ret, $code->( @_[$pos .. $next-1] ); |
|
497 |
} |
|
498 |
return @ret; |
|
499 |
} |
|
500 |
|
|
501 |
=head1 TODO |
|
502 |
|
|
503 |
=over 4 |
|
504 |
|
|
505 |
=item * XS implementations |
|
506 |
|
|
507 |
These functions are currently all written in pure perl. Some at least, may |
|
508 |
benefit from having XS implementations to speed up their logic. |
|
509 |
|
|
510 |
=item * Merge into L<List::Util> or L<List::MoreUtils> |
|
511 |
|
|
512 |
This module shouldn't really exist. The functions should instead be part of |
|
513 |
one of the existing modules that already contain many list utility functions. |
|
514 |
Having Yet Another List Utilty Module just worsens the problem. |
|
515 |
|
|
516 |
I have attempted to contact the authors of both of the above modules, to no |
|
517 |
avail; therefore I decided it best to write and release this code here anyway |
|
518 |
so that it is at least on CPAN. Once there, we can then see how best to merge |
|
519 |
it into an existing module. |
|
520 |
|
|
521 |
=back |
|
522 |
|
|
523 |
=head1 AUTHOR |
|
524 |
|
|
525 |
Paul Evans <leonerd@leonerd.org.uk> |
|
526 |
|
|
527 |
=cut |
|
528 |
|
|
529 |
0x55AA; |
Auch abrufbar als: Unified diff
Modul List::UtilsBy in Abhängigkeiten und als Fallback aufgenommen