On Dec 17, Jeff 'japhy' Pinyan said:
>The computer science way is to split the string into a list of numbers,
>and then go through the list one number at a time. Keep track of the
>first number of the potential "range", as well as the last number
>seen. If the current number is one more than the last number, then keep
>going. Once you get a number that is NOT one more than the previous, you
>generate a range. Here's the code:
I'm sorry. I forget the ending clean-up.
After you've gone through the list, you need to add what's in the
"buffer" (the values in $first and $last) to @output. Otherwise, the last
thing in your list never gets accounted for.
> sub list2range {
> my $list = shift;
> my ($first, $last);
> my @output;
>
> # remove the first number in the list...
> # and set $first and $last to it
> $list =~ s/^(\d+),?// and $first = $last = $1;
>
> for (split /,/ => $list) {
> # next number in the range
> if ($_ == $last + 1) {
> $last = $_;
> next; # get the next number
> }
>
> # otherwise, we're done with the current range
> # don't use "3-3", just use "3"
> if ($first == $last) {
> push @output, $first;
> }
> else {
> push @output, "$first-$last";
> }
>
> # now $_ is the first number in a new range
> $first = $last = $_;
> }
# clean-up time
# take care of the last part of the list
if ($first == $last) {
push @output, $first;
}
else {
push @output, "$first-$last";
}
> return join "," => @output;
> }
On a side note, that's why I like the regex solution. Far less "real
work" involved.
--
Jeff "japhy" Pinyan [EMAIL PROTECTED] http://www.pobox.com/~japhy/
RPI Acacia brother #734 http://www.perlmonks.org/ http://www.cpan.org/
** Look for "Regular Expressions in Perl" published by Manning, in 2002 **
<stu> what does y/// stand for? <tenderpuss> why, yansliterate of course.
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]