in reply to Display array as ranges?
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' );
|
|---|