Ok, well, I spent way too much time on this and came up with a really convoluted solution. But it has two nice features: a) an OO module, and b) ability to add more values later. Here goes.
package Subsequence; use overload '""' => \&list_form; sub new { my $package = shift || __PACKAGE__; return bless {ranges => {}, vals => {}}, $package; } sub insert_list { my $self = shift; my $vals = $self->{vals}; foreach my $val (sort { $a <=> $b } @_) { next if exists $vals->{$val}; if (exists $vals->{$val - 1}) { $vals->{$val} = $vals->{$val - 1}; $vals->{$val}->{end} = $val; if (exists $vals->{$val + 1}) { $vals->{$val}->{end} = $vals->{val + 1}->{end}; my $item = $vals->{val + 1}; for my $i ($val + 1 .. $vals->{$val}->{end}) { $vals->{$i} = $vals-{$val}; } delete $self->{ranges}->{$item}; } } elsif (exists $vals->{$val + 1}) { $vals->{$val} = $vals->{$val + 1}; $vals->{$val}->{start} = $val; } else { my $item = { start => $val, $end => $val }; $vals->{$val} = $item; $self->{ranges}->{$item} = $item; } } return $self; } sub list_form { my $self = shift; my $ranges = $self->{ranges}; return "(" . ( join ", ", map { $_->{start} == $_->{end} ? $_->{start} : "$_->{start}..$_->{end}" } sort {$a->{start} <=> $b->{start} } values %$ranges ) . ")"; } 1;
and used as
use Subsequence; my @test_nums = (0, 10, 11, 12, 2, 4, 3, 5, 6, 7, 9); my $x = Subsequence->new->insert_list(@test_nums); print $x, "\n"; $x->insert_list(1, 13); print $x, "\n";
This is ugly I know, but the first solution I wrote up using only arrays was even uglier, though it had the advantage of not sorting every time on retrieval. But I just couldn't figure out how to make it work generically, which was really frustrating.

In reply to Re: Display array as ranges? by Errto
in thread Display array as ranges? by xipho

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.