1List::Compare(3) User Contributed Perl Documentation List::Compare(3)
2
3
4
6 List::Compare - Compare elements of two or more lists
7
9 This document refers to version 0.55 of List::Compare. This version
10 was released August 16 2020.
11
13 The bare essentials:
14
15 @Llist = qw(abel abel baker camera delta edward fargo golfer);
16 @Rlist = qw(baker camera delta delta edward fargo golfer hilton);
17
18 $lc = List::Compare->new(\@Llist, \@Rlist);
19
20 @intersection = $lc->get_intersection;
21 @union = $lc->get_union;
22
23 ... and so forth.
24
26 Regular Case: Compare Two Lists
27 • Constructor: "new()"
28
29 Create a List::Compare object. Put the two lists into arrays
30 (named or anonymous) and pass references to the arrays to the
31 constructor.
32
33 @Llist = qw(abel abel baker camera delta edward fargo golfer);
34 @Rlist = qw(baker camera delta delta edward fargo golfer hilton);
35
36 $lc = List::Compare->new(\@Llist, \@Rlist);
37
38 By default, List::Compare's methods return lists which are sorted
39 using Perl's default "sort" mode: ASCII-betical sorting. Should
40 you not need to have these lists sorted, you may achieve a speed
41 boost by constructing the List::Compare object with the unsorted
42 option:
43
44 $lc = List::Compare->new('-u', \@Llist, \@Rlist);
45
46 or
47
48 $lc = List::Compare->new('--unsorted', \@Llist, \@Rlist);
49
50 • Alternative Constructor
51
52 If you prefer a more explicit delineation of the types of arguments
53 passed to a function, you may use this 'single hashref' kind of
54 constructor to build a List::Compare object:
55
56 $lc = List::Compare->new( { lists => [\@Llist, \@Rlist] } );
57
58 or
59
60 $lc = List::Compare->new( {
61 lists => [\@Llist, \@Rlist],
62 unsorted => 1,
63 } );
64
65 • "get_intersection()"
66
67 Get those items which appear at least once in both lists (their
68 intersection).
69
70 @intersection = $lc->get_intersection;
71
72 • "get_union()"
73
74 Get those items which appear at least once in either list (their
75 union).
76
77 @union = $lc->get_union;
78
79 • "get_unique()"
80
81 Get those items which appear (at least once) only in the first
82 list.
83
84 @Lonly = $lc->get_unique;
85 @Lonly = $lc->get_Lonly; # alias
86
87 • "get_complement()"
88
89 Get those items which appear (at least once) only in the second
90 list.
91
92 @Ronly = $lc->get_complement;
93 @Ronly = $lc->get_Ronly; # alias
94
95 • "get_symmetric_difference()"
96
97 Get those items which appear at least once in either the first or
98 the second list, but not both.
99
100 @LorRonly = $lc->get_symmetric_difference;
101 @LorRonly = $lc->get_symdiff; # alias
102 @LorRonly = $lc->get_LorRonly; # alias
103
104 • "get_bag()"
105
106 Make a bag of all those items in both lists. The bag differs from
107 the union of the two lists in that it holds as many copies of
108 individual elements as appear in the original lists.
109
110 @bag = $lc->get_bag;
111
112 • Return references rather than lists
113
114 An alternative approach to the above methods: If you do not
115 immediately require an array as the return value of the method
116 call, but simply need a reference to an (anonymous) array, use one
117 of the following parallel methods:
118
119 $intersection_ref = $lc->get_intersection_ref;
120 $union_ref = $lc->get_union_ref;
121 $Lonly_ref = $lc->get_unique_ref;
122 $Lonly_ref = $lc->get_Lonly_ref; # alias
123 $Ronly_ref = $lc->get_complement_ref;
124 $Ronly_ref = $lc->get_Ronly_ref; # alias
125 $LorRonly_ref = $lc->get_symmetric_difference_ref;
126 $LorRonly_ref = $lc->get_symdiff_ref; # alias
127 $LorRonly_ref = $lc->get_LorRonly_ref; # alias
128 $bag_ref = $lc->get_bag_ref;
129
130 • "is_LsubsetR()"
131
132 Return a true value if the first argument passed to the constructor
133 ('L' for 'left') is a subset of the second argument passed to the
134 constructor ('R' for 'right').
135
136 $LR = $lc->is_LsubsetR;
137
138 Return a true value if R is a subset of L.
139
140 $RL = $lc->is_RsubsetL;
141
142 • "is_LequivalentR()"
143
144 Return a true value if the two lists passed to the constructor are
145 equivalent, i.e. if every element in the left-hand list ('L')
146 appears at least once in the right-hand list ('R') and vice versa.
147
148 $eqv = $lc->is_LequivalentR;
149 $eqv = $lc->is_LeqvlntR; # alias
150
151 • "is_LdisjointR()"
152
153 Return a true value if the two lists passed to the constructor are
154 disjoint, i.e. if the two lists have zero elements in common (or,
155 what is the same thing, if their intersection is an empty set).
156
157 $disj = $lc->is_LdisjointR;
158
159 • "print_subset_chart()"
160
161 Pretty-print a chart showing whether one list is a subset of the
162 other.
163
164 $lc->print_subset_chart;
165
166 • "print_equivalence_chart()"
167
168 Pretty-print a chart showing whether the two lists are equivalent
169 (same elements found at least once in both).
170
171 $lc->print_equivalence_chart;
172
173 • "is_member_which()"
174
175 Determine in which (if any) of the lists passed to the constructor
176 a given string can be found. In list context, return a list of
177 those indices in the constructor's argument list corresponding to
178 lists holding the string being tested.
179
180 @memb_arr = $lc->is_member_which('abel');
181
182 In the example above, @memb_arr will be:
183
184 ( 0 )
185
186 because 'abel' is found only in @Al which holds position 0 in the
187 list of arguments passed to "new()".
188
189 In scalar context, the return value is the number of lists passed
190 to the constructor in which a given string is found.
191
192 As with other List::Compare methods which return a list, you may
193 wish the above method returned a (scalar) reference to an array
194 holding the list:
195
196 $memb_arr_ref = $lc->is_member_which_ref('baker');
197
198 In the example above, $memb_arr_ref will be:
199
200 [ 0, 1 ]
201
202 because 'baker' is found in @Llist and @Rlist, which hold positions
203 0 and 1, respectively, in the list of arguments passed to "new()".
204
205 Note: methods "is_member_which()" and "is_member_which_ref" test
206 only one string at a time and hence take only one argument. To
207 test more than one string at a time see the next method,
208 "are_members_which()".
209
210 • "are_members_which()"
211
212 Determine in which (if any) of the lists passed to the constructor
213 one or more given strings can be found. The strings to be tested
214 are placed in an array (named or anonymous); a reference to that
215 array is passed to the method.
216
217 $memb_hash_ref =
218 $lc->are_members_which([ qw| abel baker fargo hilton zebra | ]);
219
220 Note: In versions of List::Compare prior to 0.25 (April 2004), the
221 strings to be tested could be passed as a flat list. This is no
222 longer possible; the argument must now be a reference to an array.
223
224 The return value is a reference to a hash of arrays. The key for
225 each element in this hash is the string being tested. Each
226 element's value is a reference to an anonymous array whose elements
227 are those indices in the constructor's argument list corresponding
228 to lists holding the strings being tested. In the examples above,
229 $memb_hash_ref will be:
230
231 {
232 abel => [ 0 ],
233 baker => [ 0, 1 ],
234 fargo => [ 0, 1 ],
235 hilton => [ 1 ],
236 zebra => [ ],
237 };
238
239 Note: "are_members_which()" can take more than one argument;
240 "is_member_which()" and "is_member_which_ref()" each take only one
241 argument. Unlike those two methods, "are_members_which()" returns
242 a hash reference.
243
244 • "is_member_any()"
245
246 Determine whether a given string can be found in any of the lists
247 passed as arguments to the constructor. Return 1 if a specified
248 string can be found in any of the lists and 0 if not.
249
250 $found = $lc->is_member_any('abel');
251
252 In the example above, $found will be 1 because 'abel' is found in
253 one or more of the lists passed as arguments to "new()".
254
255 • "are_members_any()"
256
257 Determine whether a specified string or strings can be found in any
258 of the lists passed as arguments to the constructor. The strings
259 to be tested are placed in an array (named or anonymous); a
260 reference to that array is passed to "are_members_any".
261
262 $memb_hash_ref = $lc->are_members_any([ qw| abel baker fargo hilton zebra | ]);
263
264 Note: In versions of List::Compare prior to 0.25 (April 2004), the
265 strings to be tested could be passed as a flat list. This is no
266 longer possible; the argument must now be a reference to an array.
267
268 The return value is a reference to a hash where an element's key is
269 the string being tested and the element's value is 1 if the string
270 can be found in any of the lists and 0 if not. In the examples
271 above, $memb_hash_ref will be:
272
273 {
274 abel => 1,
275 baker => 1,
276 fargo => 1,
277 hilton => 1,
278 zebra => 0,
279 };
280
281 "zebra"'s value is 0 because "zebra" is not found in either of the
282 lists passed as arguments to "new()".
283
284 • "get_version()"
285
286 Return current List::Compare version number.
287
288 $vers = $lc->get_version;
289
290 Accelerated Case: When User Only Wants a Single Comparison
291 • Constructor "new()"
292
293 If you are certain that you will only want the results of a single
294 comparison, computation may be accelerated by passing '-a' or
295 "'--accelerated" as the first argument to the constructor.
296
297 @Llist = qw(abel abel baker camera delta edward fargo golfer);
298 @Rlist = qw(baker camera delta delta edward fargo golfer hilton);
299
300 $lca = List::Compare->new('-a', \@Llist, \@Rlist);
301
302 or
303
304 $lca = List::Compare->new('--accelerated', \@Llist, \@Rlist);
305
306 As with List::Compare's Regular case, should you not need to have a
307 sorted list returned by an accelerated List::Compare method, you
308 may achieve a speed boost by constructing the accelerated
309 List::Compare object with the unsorted option:
310
311 $lca = List::Compare->new('-u', '-a', \@Llist, \@Rlist);
312
313 or
314
315 $lca = List::Compare->new('--unsorted', '--accelerated', \@Llist, \@Rlist);
316
317 • Alternative Constructor
318
319 You may use the 'single hashref' constructor format to build a
320 List::Compare object calling for the Accelerated mode:
321
322 $lca = List::Compare->new( {
323 lists => [\@Llist, \@Rlist],
324 accelerated => 1,
325 } );
326
327 or
328
329 $lca = List::Compare->new( {
330 lists => [\@Llist, \@Rlist],
331 accelerated => 1,
332 unsorted => 1,
333 } );
334
335 • Methods
336
337 All the comparison methods available in the Regular case are
338 available to you in the Accelerated case as well.
339
340 @intersection = $lca->get_intersection;
341 @union = $lca->get_union;
342 @Lonly = $lca->get_unique;
343 @Ronly = $lca->get_complement;
344 @LorRonly = $lca->get_symmetric_difference;
345 @bag = $lca->get_bag;
346 $intersection_ref = $lca->get_intersection_ref;
347 $union_ref = $lca->get_union_ref;
348 $Lonly_ref = $lca->get_unique_ref;
349 $Ronly_ref = $lca->get_complement_ref;
350 $LorRonly_ref = $lca->get_symmetric_difference_ref;
351 $bag_ref = $lca->get_bag_ref;
352 $LR = $lca->is_LsubsetR;
353 $RL = $lca->is_RsubsetL;
354 $eqv = $lca->is_LequivalentR;
355 $disj = $lca->is_LdisjointR;
356 $lca->print_subset_chart;
357 $lca->print_equivalence_chart;
358 @memb_arr = $lca->is_member_which('abel');
359 $memb_arr_ref = $lca->is_member_which_ref('baker');
360 $memb_hash_ref = $lca->are_members_which(
361 [ qw| abel baker fargo hilton zebra | ]);
362 $found = $lca->is_member_any('abel');
363 $memb_hash_ref = $lca->are_members_any(
364 [ qw| abel baker fargo hilton zebra | ]);
365 $vers = $lca->get_version;
366
367 All the aliases for methods available in the Regular case are
368 available to you in the Accelerated case as well.
369
370 Multiple Case: Compare Three or More Lists
371 • Constructor "new()"
372
373 Create a List::Compare object. Put each list into an array and
374 pass references to the arrays to the constructor.
375
376 @Al = qw(abel abel baker camera delta edward fargo golfer);
377 @Bob = qw(baker camera delta delta edward fargo golfer hilton);
378 @Carmen = qw(fargo golfer hilton icon icon jerky kappa);
379 @Don = qw(fargo icon jerky);
380 @Ed = qw(fargo icon icon jerky);
381
382 $lcm = List::Compare->new(\@Al, \@Bob, \@Carmen, \@Don, \@Ed);
383
384 As with List::Compare's Regular case, should you not need to have a
385 sorted list returned by a List::Compare method, you may achieve a
386 speed boost by constructing the object with the unsorted option:
387
388 $lcm = List::Compare->new('-u', \@Al, \@Bob, \@Carmen, \@Don, \@Ed);
389
390 or
391
392 $lcm = List::Compare->new('--unsorted', \@Al, \@Bob, \@Carmen, \@Don, \@Ed);
393
394 • Alternative Constructor
395
396 You may use the 'single hashref' constructor format to build a
397 List::Compare object to process three or more lists at once:
398
399 $lcm = List::Compare->new( {
400 lists => [\@Al, \@Bob, \@Carmen, \@Don, \@Ed],
401 } );
402
403 or
404
405 $lcm = List::Compare->new( {
406 lists => [\@Al, \@Bob, \@Carmen, \@Don, \@Ed],
407 unsorted => 1,
408 } );
409
410 • Multiple Mode Methods Analogous to Regular and Accelerated Mode
411 Methods
412
413 Each List::Compare method available in the Regular and Accelerated
414 cases has an analogue in the Multiple case. However, the results
415 produced usually require more careful specification.
416
417 Note: Certain of the following methods available in
418 List::Compare's Multiple mode take optional numerical arguments
419 where those numbers represent the index position of a particular
420 list in the list of arguments passed to the constructor. To
421 specify this index position correctly,
422
423 • start the count at 0 (as is customary with Perl array indices);
424 and
425
426 • do not count any unsorted option ('-u' or '--unsorted')
427 preceding the array references in the constructor's own
428 argument list.
429
430 Example:
431
432 $lcmex = List::Compare->new('--unsorted', \@alpha, \@beta, \@gamma);
433
434 For the purpose of supplying a numerical argument to a method which
435 optionally takes such an argument, '--unsorted' is skipped, @alpha
436 is 0, @beta is 1, and so forth.
437
438 • "get_intersection()"
439
440 Get those items found in each of the lists passed to the
441 constructor (their intersection):
442
443 @intersection = $lcm->get_intersection;
444
445 • "get_union()"
446
447 Get those items found in any of the lists passed to the
448 constructor (their union):
449
450 @union = $lcm->get_union;
451
452 • "get_unique()"
453
454 To get those items which appear only in one particular list,
455 provide "get_unique()" with that list's index position in the
456 list of arguments passed to the constructor (not counting any
457 '-u' or '--unsorted' option).
458
459 Example: @Carmen has index position 2 in the constructor's @_.
460 To get elements unique to @Carmen:
461
462 @Lonly = $lcm->get_unique(2);
463
464 If no index position is passed to "get_unique()" it will
465 default to 0 and report items unique to the first list passed
466 to the constructor.
467
468 • "get_complement()"
469
470 To get those items which appear in any list other than one
471 particular list, provide "get_complement()" with that list's
472 index position in the list of arguments passed to the
473 constructor (not counting any '-u' or '--unsorted' option).
474
475 Example: @Don has index position 3 in the constructor's @_.
476 To get elements not found in @Don:
477
478 @Ronly = $lcm->get_complement(3);
479
480 If no index position is passed to "get_complement()" it will
481 default to 0 and report items found in any list other than the
482 first list passed to the constructor.
483
484 • "get_symmetric_difference()"
485
486 Get those items each of which appears in only one of the lists
487 passed to the constructor (their symmetric_difference);
488
489 @LorRonly = $lcm->get_symmetric_difference;
490
491 • "get_bag()"
492
493 Make a bag of all items found in any list. The bag differs
494 from the lists' union in that it holds as many copies of
495 individual elements as appear in the original lists.
496
497 @bag = $lcm->get_bag;
498
499 • Return reference instead of list
500
501 An alternative approach to the above methods: If you do not
502 immediately require an array as the return value of the method
503 call, but simply need a reference to an array, use one of the
504 following parallel methods:
505
506 $intersection_ref = $lcm->get_intersection_ref;
507 $union_ref = $lcm->get_union_ref;
508 $Lonly_ref = $lcm->get_unique_ref(2);
509 $Ronly_ref = $lcm->get_complement_ref(3);
510 $LorRonly_ref = $lcm->get_symmetric_difference_ref;
511 $bag_ref = $lcm->get_bag_ref;
512
513 • "is_LsubsetR()"
514
515 To determine whether one particular list is a subset of another
516 list passed to the constructor, provide "is_LsubsetR()" with
517 the index position of the presumed subset (ignoring any
518 unsorted option), followed by the index position of the
519 presumed superset.
520
521 Example: To determine whether @Ed is a subset of @Carmen,
522 call:
523
524 $LR = $lcm->is_LsubsetR(4,2);
525
526 A true value (1) is returned if the left-hand list is a subset
527 of the right-hand list; a false value (0) is returned
528 otherwise.
529
530 If no arguments are passed, "is_LsubsetR()" defaults to "(0,1)"
531 and compares the first two lists passed to the constructor.
532
533 • "is_LequivalentR()"
534
535 To determine whether any two particular lists are equivalent to
536 each other, provide "is_LequivalentR" with their index
537 positions in the list of arguments passed to the constructor
538 (ignoring any unsorted option).
539
540 Example: To determine whether @Don and @Ed are equivalent,
541 call:
542
543 $eqv = $lcm->is_LequivalentR(3,4);
544
545 A true value (1) is returned if the lists are equivalent; a
546 false value (0) otherwise.
547
548 If no arguments are passed, "is_LequivalentR" defaults to
549 "(0,1)" and compares the first two lists passed to the
550 constructor.
551
552 • "is_LdisjointR()"
553
554 To determine whether any two particular lists are disjoint from
555 each other (i.e., have no members in common), provide
556 "is_LdisjointR" with their index positions in the list of
557 arguments passed to the constructor (ignoring any unsorted
558 option).
559
560 Example: To determine whether @Don and @Ed are disjoint, call:
561
562 $disj = $lcm->is_LdisjointR(3,4);
563
564 A true value (1) is returned if the lists are equivalent; a
565 false value (0) otherwise.
566
567 If no arguments are passed, "is_LdisjointR" defaults to "(0,1)"
568 and compares the first two lists passed to the constructor.
569
570 • "print_subset_chart()"
571
572 Pretty-print a chart showing the subset relationships among the
573 various source lists:
574
575 $lcm->print_subset_chart;
576
577 • "print_equivalence_chart()"
578
579 Pretty-print a chart showing the equivalence relationships
580 among the various source lists:
581
582 $lcm->print_equivalence_chart;
583
584 • "is_member_which()"
585
586 Determine in which (if any) of the lists passed to the
587 constructor a given string can be found. In list context,
588 return a list of those indices in the constructor's argument
589 list (ignoring any unsorted option) corresponding to i lists
590 holding the string being tested.
591
592 @memb_arr = $lcm->is_member_which('abel');
593
594 In the example above, @memb_arr will be:
595
596 ( 0 )
597
598 because 'abel' is found only in @Al which holds position 0 in
599 the list of arguments passed to "new()".
600
601 • "is_member_which_ref()"
602
603 As with other List::Compare methods which return a list, you
604 may wish the above method returned a (scalar) reference to an
605 array holding the list:
606
607 $memb_arr_ref = $lcm->is_member_which_ref('jerky');
608
609 In the example above, $memb_arr_ref will be:
610
611 [ 3, 4 ]
612
613 because 'jerky' is found in @Don and @Ed, which hold positions
614 3 and 4, respectively, in the list of arguments passed to
615 "new()".
616
617 Note: methods "is_member_which()" and "is_member_which_ref"
618 test only one string at a time and hence take only one
619 argument. To test more than one string at a time see the next
620 method, "are_members_which()".
621
622 • "are_members_which()"
623
624 Determine in "which" (if any) of the lists passed to the
625 constructor one or more given strings can be found. The
626 strings to be tested are placed in an anonymous array, a
627 reference to which is passed to the method.
628
629 $memb_hash_ref =
630 $lcm->are_members_which([ qw| abel baker fargo hilton zebra | ]);
631
632 Note: In versions of List::Compare prior to 0.25 (April 2004),
633 the strings to be tested could be passed as a flat list. This
634 is no longer possible; the argument must now be a reference to
635 an anonymous array.
636
637 The return value is a reference to a hash of arrays. The key
638 for each element in this hash is the string being tested. Each
639 element's value is a reference to an anonymous array whose
640 elements are those indices in the constructor's argument list
641 corresponding to lists holding the strings being tested.
642
643 In the two examples above, $memb_hash_ref will be:
644
645 {
646 abel => [ 0 ],
647 baker => [ 0, 1 ],
648 fargo => [ 0, 1, 2, 3, 4 ],
649 hilton => [ 1, 2 ],
650 zebra => [ ],
651 };
652
653 Note: "are_members_which()" can take more than one argument;
654 "is_member_which()" and "is_member_which_ref()" each take only
655 one argument. "are_members_which()" returns a hash reference;
656 the other methods return either a list or a reference to an
657 array holding that list, depending on context.
658
659 • "is_member_any()"
660
661 Determine whether a given string can be found in any of the
662 lists passed as arguments to the constructor.
663
664 $found = $lcm->is_member_any('abel');
665
666 Return 1 if a specified string can be found in any of the lists
667 and 0 if not.
668
669 In the example above, $found will be 1 because 'abel' is found
670 in one or more of the lists passed as arguments to "new()".
671
672 • "are_members_any()"
673
674 Determine whether a specified string or strings can be found in
675 any of the lists passed as arguments to the constructor. The
676 strings to be tested are placed in an array (anonymous or
677 named), a reference to which is passed to the method.
678
679 $memb_hash_ref = $lcm->are_members_any([ qw| abel baker fargo hilton zebra | ]);
680
681 Note: In versions of List::Compare prior to 0.25 (April 2004),
682 the strings to be tested could be passed as a flat list. This
683 is no longer possible; the argument must now be a reference to
684 an anonymous array.
685
686 The return value is a reference to a hash where an element's
687 key is the string being tested and the element's value is 1 if
688 the string can be found in "any" of the lists and 0 if not. In
689 the two examples above, $memb_hash_ref will be:
690
691 {
692 abel => 1,
693 baker => 1,
694 fargo => 1,
695 hilton => 1,
696 zebra => 0,
697 };
698
699 "zebra"'s value will be 0 because "zebra" is not found in any
700 of the lists passed as arguments to "new()".
701
702 • "get_version()"
703
704 Return current List::Compare version number:
705
706 $vers = $lcm->get_version;
707
708 • Multiple Mode Methods Not Analogous to Regular and Accelerated Mode
709 Methods
710
711 • "get_nonintersection()"
712
713 Get those items found in any of the lists passed to the
714 constructor which do not appear in all of the lists (i.e., all
715 items except those found in the intersection of the lists):
716
717 @nonintersection = $lcm->get_nonintersection;
718
719 • "get_shared()"
720
721 Get those items which appear in more than one of the lists
722 passed to the constructor (i.e., all items except those found
723 in their symmetric difference);
724
725 @shared = $lcm->get_shared;
726
727 • "get_nonintersection_ref()"
728
729 If you only need a reference to an array as a return value
730 rather than a full array, use the following alternative
731 methods:
732
733 $nonintersection_ref = $lcm->get_nonintersection_ref;
734 $shared_ref = $lcm->get_shared_ref;
735
736 • "get_unique_all()"
737
738 Get a reference to an array of array references where each of
739 the interior arrays holds the list of those items unique to the
740 list passed to the constructor with the same index position.
741
742 $unique_all_ref = $lcm->get_unique_all();
743
744 In the example above, $unique_all_ref will hold:
745
746 [
747 [ qw| abel | ],
748 [ ],
749 [ qw| jerky | ],
750 [ ],
751 [ ],
752 ]
753
754 • "get_complement_all()"
755
756 Get a reference to an array of array references where each of
757 the interior arrays holds the list of those items in the
758 complement to the list passed to the constructor with the same
759 index position.
760
761 $complement_all_ref = $lcm->get_complement_all();
762
763 In the example above, $complement_all_ref will hold:
764
765 [
766 [ qw| hilton icon jerky | ],
767 [ qw| abel icon jerky | ],
768 [ qw| abel baker camera delta edward | ],
769 [ qw| abel baker camera delta edward jerky | ],
770 [ qw| abel baker camera delta edward jerky | ],
771 ]
772
773 Multiple Accelerated Case: Compare Three or More Lists but Request Only a
774 Single Comparison among the Lists
775 • Constructor "new()"
776
777 If you are certain that you will only want the results of a single
778 comparison among three or more lists, computation may be
779 accelerated by passing '-a' or "'--accelerated" as the first
780 argument to the constructor.
781
782 @Al = qw(abel abel baker camera delta edward fargo golfer);
783 @Bob = qw(baker camera delta delta edward fargo golfer hilton);
784 @Carmen = qw(fargo golfer hilton icon icon jerky kappa);
785 @Don = qw(fargo icon jerky);
786 @Ed = qw(fargo icon icon jerky);
787
788 $lcma = List::Compare->new('-a',
789 \@Al, \@Bob, \@Carmen, \@Don, \@Ed);
790
791 As with List::Compare's other cases, should you not need to have a
792 sorted list returned by a List::Compare method, you may achieve a
793 speed boost by constructing the object with the unsorted option:
794
795 $lcma = List::Compare->new('-u', '-a',
796 \@Al, \@Bob, \@Carmen, \@Don, \@Ed);
797
798 or
799
800 $lcma = List::Compare->new('--unsorted', '--accelerated',
801 \@Al, \@Bob, \@Carmen, \@Don, \@Ed);
802
803 As was the case with List::Compare's Multiple mode, do not count
804 the unsorted option ('-u' or '--unsorted') or the accelerated
805 option ('-a' or '--accelerated') when determining the index
806 position of a particular list in the list of array references
807 passed to the constructor.
808
809 Example:
810
811 $lcmaex = List::Compare->new('--unsorted', '--accelerated',
812 \@alpha, \@beta, \@gamma);
813
814 • Alternative Constructor
815
816 The 'single hashref' format may be used to construct a
817 List::Compare object which calls for accelerated processing of
818 three or more lists at once:
819
820 $lcmaex = List::Compare->new( {
821 accelerated => 1,
822 lists => [\@alpha, \@beta, \@gamma],
823 } );
824
825 or
826
827 $lcmaex = List::Compare->new( {
828 unsorted => 1,
829 accelerated => 1,
830 lists => [\@alpha, \@beta, \@gamma],
831 } );
832
833 • Methods
834
835 For the purpose of supplying a numerical argument to a method which
836 optionally takes such an argument, '--unsorted' and
837 "'--accelerated" are skipped, @alpha is 0, @beta is 1, and so
838 forth. To get a list of those items unique to @gamma, you would
839 call:
840
841 @gamma_only = $lcmaex->get_unique(2);
842
843 Passing Seen-hashes to the Constructor Instead of Arrays
844 • When Seen-Hashes Are Already Available to You
845
846 Suppose that in a particular Perl program, you had to do extensive
847 munging of data from an external source and that, once you had
848 correctly parsed a line of data, it was easier to assign that datum
849 to a hash than to an array. More specifically, suppose that you
850 used each datum as the key to an element of a lookup table in the
851 form of a seen-hash:
852
853 my %Llist = (
854 abel => 2,
855 baker => 1,
856 camera => 1,
857 delta => 1,
858 edward => 1,
859 fargo => 1,
860 golfer => 1,
861 );
862
863 my %Rlist = (
864 baker => 1,
865 camera => 1,
866 delta => 2,
867 edward => 1,
868 fargo => 1,
869 golfer => 1,
870 hilton => 1,
871 );
872
873 In other words, suppose it was more convenient to compute a lookup
874 table implying a list than to compute that list explicitly.
875
876 Since in almost all cases List::Compare takes the elements in the
877 arrays passed to its constructor and internally assigns them to
878 elements in a seen-hash, why shouldn't you be able to pass
879 (references to) seen-hashes directly to the constructor and avoid
880 unnecessary array assignments before the constructor is called?
881
882 • Constructor "new()"
883
884 You can now do so:
885
886 $lcsh = List::Compare->new(\%Llist, \%Rlist);
887
888 • Methods
889
890 All of List::Compare's output methods are supported without further
891 modification when references to seen-hashes are passed to the
892 constructor.
893
894 @intersection = $lcsh->get_intersection;
895 @union = $lcsh->get_union;
896 @Lonly = $lcsh->get_unique;
897 @Ronly = $lcsh->get_complement;
898 @LorRonly = $lcsh->get_symmetric_difference;
899 @bag = $lcsh->get_bag;
900 $intersection_ref = $lcsh->get_intersection_ref;
901 $union_ref = $lcsh->get_union_ref;
902 $Lonly_ref = $lcsh->get_unique_ref;
903 $Ronly_ref = $lcsh->get_complement_ref;
904 $LorRonly_ref = $lcsh->get_symmetric_difference_ref;
905 $bag_ref = $lcsh->get_bag_ref;
906 $LR = $lcsh->is_LsubsetR;
907 $RL = $lcsh->is_RsubsetL;
908 $eqv = $lcsh->is_LequivalentR;
909 $disj = $lcsh->is_LdisjointR;
910 $lcsh->print_subset_chart;
911 $lcsh->print_equivalence_chart;
912 @memb_arr = $lsch->is_member_which('abel');
913 $memb_arr_ref = $lsch->is_member_which_ref('baker');
914 $memb_hash_ref = $lsch->are_members_which(
915 [ qw| abel baker fargo hilton zebra | ]);
916 $found = $lsch->is_member_any('abel');
917 $memb_hash_ref = $lsch->are_members_any(
918 [ qw| abel baker fargo hilton zebra | ]);
919 $vers = $lcsh->get_version;
920 $unique_all_ref = $lcsh->get_unique_all();
921 $complement_all_ref = $lcsh->get_complement_all();
922
923 • Accelerated Mode and Seen-Hashes
924
925 To accelerate processing when you want only a single comparison
926 among two or more lists, you can pass '-a' or "'--accelerated" to
927 the constructor before passing references to seen-hashes.
928
929 $lcsha = List::Compare->new('-a', \%Llist, \%Rlist);
930
931 To compare three or more lists simultaneously, pass three or more
932 references to seen-hashes. Thus,
933
934 $lcshm = List::Compare->new(\%Alpha, \%Beta, \%Gamma);
935
936 will generate meaningful comparisons of three or more lists
937 simultaneously.
938
939 • Unsorted Results and Seen-Hashes
940
941 If you do not need sorted lists returned, pass '-u' or "--unsorted"
942 to the constructor before passing references to seen-hashes.
943
944 $lcshu = List::Compare->new('-u', \%Llist, \%Rlist);
945 $lcshau = List::Compare->new('-u', '-a', \%Llist, \%Rlist);
946 $lcshmu = List::Compare->new('--unsorted', \%Alpha, \%Beta, \%Gamma);
947
948 As was true when we were using List::Compare's Multiple and
949 Multiple Accelerated modes, do not count any unsorted or
950 accelerated option when determining the array index of a particular
951 seen-hash reference passed to the constructor.
952
953 • Alternative Constructor
954
955 The 'single hashref' form of constructor is also available to build
956 List::Compare objects where seen-hashes are used as arguments:
957
958 $lcshu = List::Compare->new( {
959 unsorted => 1,
960 lists => [\%Llist, \%Rlist],
961 } );
962
963 $lcshau = List::Compare->new( {
964 unsorted => 1,
965 accelerated => 1,
966 lists => [\%Llist, \%Rlist],
967 } );
968
969 $lcshmu = List::Compare->new( {
970 unsorted => 1,
971 lists => [\%Alpha, \%Beta, \%Gamma],
972 } );
973
975 General Comments
976 List::Compare is an object-oriented implementation of very common Perl
977 code (see "History, References and Development" below) used to
978 determine interesting relationships between two or more lists at a
979 time. A List::Compare object is created and automatically computes the
980 values needed to supply List::Compare methods with appropriate results.
981 In the current implementation List::Compare methods will return new
982 lists containing the items found in any designated list alone (unique),
983 any list other than a designated list (complement), the intersection
984 and union of all lists and so forth. List::Compare also has (a)
985 methods to return Boolean values indicating whether one list is a
986 subset of another and whether any two lists are equivalent to each
987 other (b) methods to pretty-print very simple charts displaying the
988 subset and equivalence relationships among lists.
989
990 Except for List::Compare's "get_bag()" method, multiple instances of an
991 element in a given list count only once with respect to computing the
992 intersection, union, etc. of the two lists. In particular,
993 List::Compare considers two lists as equivalent if each element of the
994 first list can be found in the second list and vice versa.
995 'Equivalence' in this usage takes no note of the frequency with which
996 elements occur in either list or their order within the lists.
997 List::Compare asks the question: Did I see this item in this list at
998 all? Only when you use "List::Compare::get_bag()" to compute a bag
999 holding the two lists do you ask the question: How many times did this
1000 item occur in this list?
1001
1002 List::Compare Modes
1003 In its current implementation List::Compare has four modes of
1004 operation.
1005
1006 • Regular Mode
1007
1008 List::Compare's Regular mode is based on List::Compare v0.11 -- the
1009 first version of List::Compare released to CPAN (June 2002). It
1010 compares only two lists at a time. Internally, its initializer
1011 does all computations needed to report any desired comparison and
1012 its constructor stores the results of these computations. Its
1013 public methods merely report these results.
1014
1015 This approach has the advantage that if you need to examine more
1016 than one form of comparison between two lists (e.g., the union,
1017 intersection and symmetric difference of two lists), the
1018 comparisons are pre-calculated. This approach is efficient because
1019 certain types of comparison presuppose that other types have
1020 already been calculated. For example, to calculate the symmetric
1021 difference of two lists, one must first determine the items unique
1022 to each of the two lists.
1023
1024 • Accelerated Mode
1025
1026 The current implementation of List::Compare offers you the option
1027 of getting even faster results provided that you only need the
1028 result from a single form of comparison between two lists. (e.g.,
1029 only the union -- nothing else). In the Accelerated mode,
1030 List::Compare's initializer does no computation and its constructor
1031 stores only references to the two source lists. All computation
1032 needed to report results is deferred to the method calls.
1033
1034 The user selects this approach by passing the option flag '-a' to
1035 the constructor before passing references to the two source lists.
1036 List::Compare notes the option flag and silently switches into
1037 Accelerated mode. From the perspective of the user, there is no
1038 further difference in the code or in the results.
1039
1040 Benchmarking suggests that List::Compare's Accelerated mode (a) is
1041 faster than its Regular mode when only one comparison is requested;
1042 (b) is about as fast as Regular mode when two comparisons are
1043 requested; and (c) becomes considerably slower than Regular mode as
1044 each additional comparison above two is requested.
1045
1046 • Multiple Mode
1047
1048 List::Compare now offers the possibility of comparing three or more
1049 lists at a time. Simply store the extra lists in arrays and pass
1050 references to those arrays to the constructor. List::Compare
1051 detects that more than two lists have been passed to the
1052 constructor and silently switches into Multiple mode.
1053
1054 As described in the Synopsis above, comparing more than two lists
1055 at a time offers you a wider, more complex palette of comparison
1056 methods. Individual items may appear in just one source list, in
1057 all the source lists, or in some number of lists between one and
1058 all. The meaning of 'union', 'intersection' and 'symmetric
1059 difference' is conceptually unchanged when you move to multiple
1060 lists because these are properties of all the lists considered
1061 together. In contrast, the meaning of 'unique', 'complement',
1062 'subset' and 'equivalent' changes because these are properties of
1063 one list compared with another or with all the other lists
1064 combined.
1065
1066 List::Compare takes this complexity into account by allowing you to
1067 pass arguments to the public methods requesting results with
1068 respect to a specific list (for "get_unique()" and
1069 "get_complement()") or a specific pair of lists (for
1070 "is_LsubsetR()" and "is_LequivalentR()").
1071
1072 List::Compare further takes this complexity into account by
1073 offering the new methods "get_shared()" and "get_nonintersection()"
1074 described in the Synopsis above.
1075
1076 • Multiple Accelerated Mode
1077
1078 Beginning with version 0.25, introduced in April 2004,
1079 List::Compare offers the possibility of accelerated computation of
1080 a single comparison among three or more lists at a time. Simply
1081 store the extra lists in arrays and pass references to those arrays
1082 to the constructor preceded by the '-a' argument as was done with
1083 the simple (two lists only) accelerated mode. List::Compare
1084 detects that more than two lists have been passed to the
1085 constructor and silently switches into Multiple Accelerated mode.
1086
1087 • Unsorted Option
1088
1089 When List::Compare is used to return lists representing various
1090 comparisons of two or more lists (e.g., the lists' union or
1091 intersection), the lists returned are, by default, sorted using
1092 Perl's default "sort" mode: ASCII-betical sorting. Sorting
1093 produces results which are more easily human-readable but may
1094 entail a performance cost.
1095
1096 Should you not need sorted results, you can avoid the potential
1097 performance cost by calling List::Compare's constructor using the
1098 unsorted option. This is done by calling '-u' or '--unsorted' as
1099 the first argument passed to the constructor, i.e., as an argument
1100 called before any references to lists are passed to the
1101 constructor.
1102
1103 Note that if are calling List::Compare in the Accelerated or
1104 Multiple Accelerated mode and wish to have the lists returned in
1105 unsorted order, you first pass the argument for the unsorted option
1106 ('-u' or '--unsorted') and then pass the argument for the
1107 Accelerated mode ('-a' or '--accelerated').
1108
1109 Miscellaneous Methods
1110 It would not really be appropriate to call "get_shared()" and
1111 "get_nonintersection()" in Regular or Accelerated mode since they are
1112 conceptually based on the notion of comparing more than two lists at a
1113 time. However, there is always the possibility that a user may be
1114 comparing only two lists (accelerated or not) and may accidentally call
1115 one of those two methods. To prevent fatal run-time errors and to
1116 caution you to use a more appropriate method, these two methods are
1117 defined for Regular and Accelerated modes so as to return suitable
1118 results but also generate a carp message that advise you to re-code.
1119
1120 Similarly, the method "is_RsubsetL()" is appropriate for the Regular
1121 and Accelerated modes but is not really appropriate for Multiple mode.
1122 As a defensive maneuver, it has been defined for Multiple mode so as to
1123 return suitable results but also to generate a carp message that
1124 advises you to re-code.
1125
1126 In List::Compare v0.11 and earlier, the author provided aliases for
1127 various methods based on the supposition that the source lists would be
1128 referred to as 'A' and 'B'. Now that you can compare more than two
1129 lists at a time, the author feels that it would be more appropriate to
1130 refer to the elements of two-argument lists as the left-hand and right-
1131 hand elements. Hence, we are discouraging the use of methods such as
1132 "get_Aonly()", "get_Bonly()" and "get_AorBonly()" as aliases for
1133 "get_unique()", "get_complement()" and "get_symmetric_difference()".
1134 However, to guarantee backwards compatibility for the vast audience of
1135 Perl programmers using earlier versions of List::Compare (all 10e1 of
1136 you) these and similar methods for subset relationships are still
1137 defined.
1138
1139 List::Compare::SeenHash Discontinued Beginning with Version 0.26
1140 Prior to v0.26, introduced April 11, 2004, if a user wished to pass
1141 references to seen-hashes to List::Compare's constructor rather than
1142 references to arrays, he or she had to call a different, parallel
1143 module: List::Compare::SeenHash. The code for that looked like this:
1144
1145 use List::Compare::SeenHash;
1146
1147 my %Llist = (
1148 abel => 2,
1149 baker => 1,
1150 camera => 1,
1151 delta => 1,
1152 edward => 1,
1153 fargo => 1,
1154 golfer => 1,
1155 );
1156
1157 my %Rlist = (
1158 baker => 1,
1159 camera => 1,
1160 delta => 2,
1161 edward => 1,
1162 fargo => 1,
1163 golfer => 1,
1164 hilton => 1,
1165 );
1166
1167 my $lcsh = List::Compare::SeenHash->new(\%Llist, \%Rlist);
1168
1169 List::Compare::SeenHash is deprecated beginning with version 0.26. All
1170 its functionality (and more) has been implemented in List::Compare
1171 itself, since a user can now pass either a series of array references
1172 or a series of seen-hash references to List::Compare's constructor.
1173
1174 To simplify future maintenance of List::Compare,
1175 List::Compare::SeenHash.pm will no longer be distributed with
1176 List::Compare, nor will the files in the test suite which tested
1177 List::Compare::SeenHash upon installation be distributed.
1178
1179 Should you still need List::Compare::SeenHash, use version 0.25 from
1180 CPAN, or simply edit your Perl programs which used
1181 List::Compare::SeenHash. Those scripts may be edited quickly with, for
1182 example, this editing command in Unix text editor vi:
1183
1184 :1,$s/List::Compare::SeenHash/List::Compare/gc
1185
1186 A Non-Object-Oriented Interface: List::Compare::Functional
1187 Version 0.21 of List::Compare introduced List::Compare::Functional, a
1188 functional (i.e., non-object-oriented) interface to list comparison
1189 functions. List::Compare::Functional supports the same functions
1190 currently supported by List::Compare. It works similar to
1191 List::Compare's Accelerated and Multiple Accelerated modes (described
1192 above), bit it does not require use of the '-a' flag in the function
1193 call. List::Compare::Functional will return unsorted comparisons of
1194 two lists by passing '-u' or '--unsorted' as the first argument to the
1195 function. Please see the documentation for List::Compare::Functional
1196 to learn how to import its functions into your main package.
1197
1199 The program was created with Perl 5.6. The use of h2xs to prepare the
1200 module's template installed "require 5.005_62;" at the top of the
1201 module. This has been commented out in the actual module as the code
1202 appears to be compatible with earlier versions of Perl; how earlier the
1203 author cannot say. In particular, the author would like the module to
1204 be installable on older versions of MacPerl. As is, the author has
1205 successfully installed the module on Linux, Windows 9x and Windows
1206 2000. See <http://testers.cpan.org/show/List-Compare.html> for a list
1207 of other systems on which this version of List::Compare has been tested
1208 and installed.
1209
1211 The Code Itself
1212 List::Compare is based on code presented by Tom Christiansen & Nathan
1213 Torkington in Perl Cookbook <http://www.oreilly.com/catalog/cookbook/>
1214 (a.k.a. the 'Ram' book), O'Reilly & Associates, 1998, Recipes 4.7 and
1215 4.8. Similar code is presented in the Camel book: Programming Perl,
1216 by Larry Wall, Tom Christiansen, Jon Orwant.
1217 <http://www.oreilly.com/catalog/pperl3/>, 3rd ed, O'Reilly &
1218 Associates, 2000. The list comparison code is so basic and Perlish
1219 that I suspect it may have been written by Larry himself at the dawn of
1220 Perl time. The "get_bag()" method was inspired by Jarkko Hietaniemi's
1221 Set::Bag module and Daniel Berger's Set::Array module, both available
1222 on CPAN.
1223
1224 List::Compare's original objective was simply to put this code in a
1225 modular, object-oriented framework. That framework, not surprisingly,
1226 is taken mostly from Damian Conway's Object Oriented Perl
1227 <http://www.manning.com/Conway/index.html>, Manning Publications, 2000.
1228
1229 With the addition of the Accelerated, Multiple and Multiple Accelerated
1230 modes, List::Compare expands considerably in both size and
1231 capabilities. Nonetheless, Tom and Nat's Cookbook code still lies at
1232 its core: the use of hashes as look-up tables to record elements seen
1233 in lists. Please note: List::Compare is not concerned with any
1234 concept of 'equality' among lists which hinges upon the frequency with
1235 which, or the order in which, elements appear in the lists to be
1236 compared. If this does not meet your needs, you should look elsewhere
1237 or write your own module.
1238
1239 The Inspiration
1240 I realized the usefulness of putting the list comparison code into a
1241 module while preparing an introductory level Perl course given at the
1242 New School University's Computer Instruction Center in April-May 2002.
1243 I was comparing lists left and right. When I found myself writing very
1244 similar functions in different scripts, I knew a module was lurking
1245 somewhere. I learned the truth of the mantra ''Repeated Code is a
1246 Mistake'' from a 2001 talk by Mark-Jason Dominus
1247 <http://perl.plover.com/> to the New York Perlmongers
1248 <http://ny.pm.org/>. See
1249 <http://www.perl.com/pub/a/2000/11/repair3.html>.
1250
1251 The first public presentation of this module took place at Perl Seminar
1252 New York <http://groups.yahoo.com/group/perlsemny> on May 21, 2002.
1253 Comments and suggestions were provided there and since by Glenn Maciag,
1254 Gary Benson, Josh Rabinowitz, Terrence Brannon and Dave Cross.
1255
1256 The placement in the installation tree of Test::ListCompareSpecial came
1257 as a result of a question answered by Michael Graham in his talk
1258 ''Test::More to Test::Extreme'' given at Yet Another Perl
1259 Conference::Canada in Ottawa, Ontario, on May 16, 2003.
1260
1261 In May-June 2003, Glenn Maciag made valuable suggestions which led to
1262 changes in method names and documentation in v0.20.
1263
1264 Another presentation at Perl Seminar New York in October 2003 prompted
1265 me to begin planning List::Compare::Functional.
1266
1267 In a November 2003 Perl Seminar New York presentation, Ben Holtzman
1268 discussed the performance costs entailed in Perl's "sort" function.
1269 This led me to ask, ''Why should a user of List::Compare pay this
1270 performance cost if he or she doesn't need a human-readable list as a
1271 result (as would be the case if the list returned were used as the
1272 input into some other function)?'' This led to the development of
1273 List::Compare's unsorted option.
1274
1275 An April 2004 offer by Kevin Carlson to write an article for The Perl
1276 Journal (<http://tpj.com>) led me to re-think whether a separate module
1277 (the former List::Compare::SeenHash) was truly needed when a user
1278 wanted to provide the constructor with references to seen-hashes rather
1279 than references to arrays. Since I had already adapted
1280 List::Compare::Functional to accept both kinds of arguments, I adapted
1281 List::Compare in the same manner. This meant that
1282 List::Compare::SeenHash and its related installation tests could be
1283 deprecated and deleted from the CPAN distribution.
1284
1285 A remark by David H. Adler at a New York Perlmongers meeting in April
1286 2004 led me to develop the 'single hashref' alternative constructor
1287 format, introduced in version 0.29 the following month.
1288
1289 Presentations at two different editions of Yet Another Perl Conference
1290 (YAPC) inspired the development of List::Compare versions 0.30 and
1291 0.31. I was selected to give a talk on List::Compare at YAPC::NA::2004
1292 in Buffalo. This spurred me to improve certain aspects of the
1293 documentation. Version 0.31 owes its inspiration to one talk at the
1294 Buffalo YAPC and one earlier talk at YAPC::EU::2003 in Paris. In Paris
1295 I heard Paul Johnson speak on his CPAN module Devel::Cover and on
1296 coverage analysis more generally. That material was over my head at
1297 that time, but in Buffalo I heard Andy Lester discuss Devel::Cover as
1298 part of his discussion of testing and of the Phalanx project
1299 (<http://qa.perl.org/phalanx>). This time I got it, and when I
1300 returned from Buffalo I applied Devel::Cover to List::Compare and wrote
1301 additional tests to improve its subroutine and statement coverage. In
1302 addition, I added two new methods, "get_unique_all" and
1303 "get_complement_all". In writing these two methods, I followed a model
1304 of test-driven development much more so than in earlier versions of
1305 List::Compare and my other CPAN modules. The result? List::Compare's
1306 test suite grew by over 3300 tests to nearly 23,000 tests.
1307
1308 At the Second New York Perl Hackathon (May 02 2015), a project was
1309 created to request performance improvements in certain List::Compare
1310 functions
1311 (<https://github.com/nyperlmongers/nyperlhackathon2015/wiki/List-Compare-Performance-Improvements>).
1312 Hackathon participant Michael Rawson submitted a pull request with
1313 changes to List::Compare::Base::_Auxiliary. After these revisions were
1314 benchmarked, a patch embodying the pull request was accepted, leading
1315 to CPAN version 0.53.
1316
1317 If You Like List::Compare, You'll Love ...
1318 While preparing this module for distribution via CPAN, I had occasion
1319 to study a number of other modules already available on CPAN. Each of
1320 these modules is more sophisticated than List::Compare -- which is not
1321 surprising since all that List::Compare originally aspired to do was to
1322 avoid typing Cookbook code repeatedly. Here is a brief description of
1323 the features of these modules. (Warning: The following discussion is
1324 only valid as of June 2002. Some of these modules may have changed
1325 since then.)
1326
1327 • Algorithm::Diff - Compute 'intelligent' differences between two
1328 files/lists (<http://search.cpan.org/dist/Algorithm-Diff/>)
1329
1330 Algorithm::Diff is a sophisticated module originally written by
1331 Mark-Jason Dominus, later maintained by Ned Konz, now maintained by
1332 Tye McQueen. Think of the Unix "diff" utility and you're on the
1333 right track. Algorithm::Diff exports methods such as "diff", which
1334 ''computes the smallest set of additions and deletions necessary to
1335 turn the first sequence into the second, and returns a description
1336 of these changes.'' Algorithm::Diff is mainly concerned with the
1337 sequence of elements within two lists. It does not export
1338 functions for intersection, union, subset status, etc.
1339
1340 • Array::Compare - Perl extension for comparing arrays
1341 (<http://search.cpan.org/dist/Array-Compare/>)
1342
1343 Array::Compare, by Dave Cross, asks whether two arrays are the same
1344 or different by doing a "join" on each string with a separator
1345 character and comparing the resulting strings. Like List::Compare,
1346 it is an object-oriented module. A sophisticated feature of
1347 Array::Compare is that it allows you to specify how 'whitespace' in
1348 an array (an element which is undefined, the empty string, or
1349 whitespace within an element) should be evaluated for purpose of
1350 determining equality or difference. It does not directly provide
1351 methods for intersection and union.
1352
1353 • Data::Compare - compare perl data structures
1354 (<http://search.cpan.org/dist/Data-Compare/>)
1355
1356 This library compares Perl data structures recursively. Comes
1357 recommended by Slaven Rezić!
1358
1359 • List::Util - A selection of general-utility list subroutines
1360 (<http://search.cpan.org/dist/Scalar-List-Utils/>)
1361
1362 List::Util, by Graham Barr, exports a variety of simple, useful
1363 functions for operating on one list at a time. The "min"
1364 function returns the lowest numerical value in a list; the "max"
1365 function returns the highest value; and so forth. List::Compare
1366 differs from List::Util in that it is object-oriented and that it
1367 works on two strings at a time rather than just one -- but it aims
1368 to be as simple and useful as List::Util. List::Util will be
1369 included in the standard Perl distribution as of Perl 5.8.0.
1370
1371 Lists::Util (<http://search.cpan.org/dist/List-MoreUtils/>), by
1372 Tassilo von Parseval, building on code by Terrence Brannon,
1373 provides methods which extend List::Util's functionality.
1374
1375 • Quantum::Superpositions
1376 (<http://search.cpan.org/dist/Quantum-Superpositions/>), originally
1377 by Damian Conway, now maintained by Steven Lembark is useful if, in
1378 addition to comparing lists, you need to emulate quantum
1379 supercomputing as well. Not for the eigen-challenged.
1380
1381 • Set::Scalar - basic set operations
1382 (<http://search.cpan.org/dist/Set-Scalar/>)
1383
1384 Set::Bag - bag (multiset) class
1385 (<http://search.cpan.org/dist/Set-Bag/>)
1386
1387 Both of these modules are by Jarkko Hietaniemi. Set::Scalar has
1388 methods to return the intersection, union, difference and symmetric
1389 difference of two sets, as well as methods to return items unique
1390 to a first set and complementary to it in a second set. It has
1391 methods for reporting considerably more variants on subset status
1392 than does List::Compare. However, benchmarking suggests that
1393 List::Compare, at least in Regular mode, is considerably faster
1394 than Set::Scalar for those comparison methods which List::Compare
1395 makes available.
1396
1397 Set::Bag enables one to deal more flexibly with the situation in
1398 which one has more than one instance of an element in a list.
1399
1400 • Set::Array - Arrays as objects with lots of handy methods
1401 (including set comparisons) and support for method chaining.
1402 (<http://search.cpan.org/dist/Set-Array/>)
1403
1404 Set::Array, by Daniel Berger, now maintained by Ron Savage, ''aims
1405 to provide built-in methods for operations that people are always
1406 asking how to do,and which already exist in languages like Ruby.''
1407 Among the many methods in this module are some for intersection,
1408 union, etc. To install Set::Array, you must first install the Want
1409 module, also available on CPAN.
1410
1412 • Syohei YOSHIDA
1413
1414 Pull request accepted May 22 2015.
1415
1416 • Paulo Custodio
1417
1418 Pull request accepted June 07 2015, correcting errors in
1419 "_subset_subengine()".
1420
1422 There are no bug reports outstanding on List::Compare as of the most
1423 recent CPAN upload date of this distribution.
1424
1426 Please report any bugs by mail to "bug-List-Compare@rt.cpan.org" or
1427 through the web interface at <http://rt.cpan.org>.
1428
1430 James E. Keenan (jkeenan@cpan.org). When sending correspondence,
1431 please include 'List::Compare' or 'List-Compare' in your subject line.
1432
1433 Creation date: May 20, 2002. Last modification date: August 16 2020.
1434
1435 Development repository: <https://github.com/jkeenan/list-compare>
1436
1438 Copyright (c) 2002-20 James E. Keenan. United States. All rights
1439 reserved. This is free software and may be distributed under the same
1440 terms as Perl itself.
1441
1443 BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
1444 FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT
1445 WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER
1446 PARTIES PROVIDE THE SOFTWARE ''AS IS'' WITHOUT WARRANTY OF ANY KIND,
1447 EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1448 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
1449 ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
1450 YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
1451 NECESSARY SERVICING, REPAIR, OR CORRECTION.
1452
1453 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
1454 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
1455 REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE LIABLE
1456 TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL, OR
1457 CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
1458 SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
1459 RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
1460 FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
1461 SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
1462 DAMAGES.
1463
1464
1465
1466perl v5.34.0 2021-07-22 List::Compare(3)