# Routine to create and examine numeric ranges
# e.g. rangein 1 2 3 5 6 becomes 1-3 5 6
# and rangeout 1-3 5 6 becomes 1 2 3 5 6
#!/usr/bin/perl -wT
# Snippet of code written by Nigel Horne, Wharfedale Computers Ltd., B
+arnsley
# njh@despammed.com
# Routine to create and examine numeric ranges
# e.g. rangein 1 2 3 5 6 becomes 1-3 5 6
# and rangeout 1-3 5 6 becomes 1 2 3 5 6
# 20/8/02: handle zeros
use strict;
# Pre-condition: The argument must be a sorted array of space separate
+d
# unique numbers. This condition is not verified.
sub rangein {
my $input = shift;
my $max = -2;
my $min = -2;
foreach my $number (split(/ /, $input)) {
if($number > $max + 1) {
if($max > $min + 1) {
print "$min-$max ";
} elsif($max == $min + 1) {
print "$min $max ";
} elsif($min >= 0) {
print "$min ";
}
$min = ($max = $number);
} elsif($number == $max + 1) {
$max++;
} else {
$min = ($max = $number);
}
}
if($max > $min + 1) {
print "$min-$max ";
} elsif($max == $min + 1) {
print "$min $max ";
} elsif($min >= 0) {
print "$min ";
}
print "\n";
}
sub rangeout {
my $input = shift;
foreach my $range (split(/ /, $input)) {
if($range =~ /(.+)-(.+)/) {
foreach ($1..$2) {
print "$_ ";
}
} else {
print "$range ";
}
}
print "\n";
}
print "testing rangein...\n";
&rangein("0 1 3 4 5 7 ");
&rangein("1 3 4 5 7 ");
&rangein("1 ");
&rangein("1 3 ");
&rangein("1 2 3 ");
&rangein("1 2 3 4 6 7 8 ");
print "testing rangeout...\n";
&rangeout("0 1 3-5 7 ");
&rangeout("1 3-5 7 ");
&rangeout("1 ");
&rangeout("1 3 ");
&rangeout("1-3 ");
&rangeout("1-4 6-8 ");