package Uniq; use strict; use warnings; require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw( uniq dups distinct ); our $VERSION = '0.01'; sub uniq{ # Eliminates redundant values from sorted list of values input. my $prev = undef; my @out; foreach my $val (@_){ next if $prev && ($prev eq $val); $prev = $val; push(@out, $val); } return @out; } sub dups{ # Returns a list of values that occur multiple times in # the sorted list of values supplied as input. my $prev = undef; my $ins = undef; my @out; foreach my $val (@_){ if ($prev && $prev eq $val){ next if ($ins && $ins eq $val); push(@out, $val); $ins = $val; }else{ $prev = $val; } } return @out; } sub distinct{ # Eliminates values mentioned more than once from a list of # sorted values presented. my $prev = undef; my $ctr = 0; my @out; foreach my $val (@_){ if ($prev){ if ($prev eq $val){ $ctr ++; next; } push(@out,$prev) if ($ctr == 1); $prev = $val; $ctr = 1; next; }else{ $prev = $val; $ctr = 1; } } return @out; } 1; __END__ =head1 NAME Uniq - Perl extension for managing list of values. =head1 SYNOPSIS use Uniq; my @out = uniq sort @input; my @out = distinct sort @input; my @out = dups sort @input; Uniq exports three methods 'uniq', 'distinct' and 'dups'. All these methods accepts a list and returns a list. =head1 ABSTRACT Similar functionality is available at shell prompts of *nix O/S. This modules is attempting to provide the same to Perl programming, =head1 DESCRIPTION The usage of the methods provided here is simple. You always provide a sorted list to any of these methods and accept a sorted list of values in return. Suppose @lis1 and @list2 are two available lists defined as follows: @list_1 = qw ( first list of values ); @list_1 = qw ( second list of values ); and we run the following commands: my @output_1 = uniq sort @list1 @list2; my @output_2 = distinct sort @list1 @list2; my @output_3 = dups sort @list1 @list2; Now @output_1 has qw( first list of second values ) @output_2 has qw( first second ) and @output_3 has qw( list of values ) Thus @output_1 has all values from either input lists sans any redundant values. @output_2 has exactly those values that appear at most once in combined list. On the other hand @output_3 has a list of values that appear multiple times in input. =head2 EXPORT Exported are methods 1) uniq [ similar to 'uniq' shell command ] 2) distinct [ similar to 'uniq -u' shell command ] 3) dups [ similar to 'uniq -d' shell command ] =head1 SEE ALSO none. =head1 AUTHOR Syamala Tadigadapa =head1 COPYRIGHT AND LICENSE Copyright 2003 by Syamala Tadigadapa. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut