I like the regex solution linked elsewhere, but how about something a little bit functional?
#!/usr/bin/perl use strict; use warnings; use Test::More tests => 4; sub range { my @numbers = sort { $a <=> $b } @_; my ($in_range, @range); while (@numbers > 1) { my $current = shift @numbers; my $gap = $numbers[0] - $current; for my $action ( [ sub { $_[0] && $_[1] > 1 }, [ ', ', 0 ] ], [ sub { ! $_[0] && $_[1] == 1 }, [ '..', 1 ] ], [ sub { ! $_[0] }, [ ', ', 0 ] ], ) { my ($condition, $values) = @$action; next unless $condition->( $in_range, $gap ); push @range, $current, $values->[0]; $in_range = $values->[1]; last; } } return join('', @range, @numbers); } my $result = range( 0, 10, 11, 12, 2, 4, 3, 5, 6, 7, 9 ); like( $result, qr/^0/, 'range() should sort results' ); like( $result, qr/12$/, '... including end' ); like( $result, qr/2\.\./, '... finding start of range' ); is( $result, '0, 2..7, 9..12', '... and rangifying numbers' );
In reply to Re: Display array as ranges?
by chromatic
in thread Display array as ranges?
by xipho
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |