http://www.perlmonks.org?node_id=1025072


in reply to [Solved] Converting a list of numbers to use a range operator

non-strict hack :)
use Data::Dump qw/pp/; @array = (10, 11, 12, 2, 3, 4, 7); @a = sort {$a <=> $b} @array; $first = $last = shift @a; # init start push @a,"inf"; # infinity end for $now (@a) { unless ( $last+1 == $now ) { push @ranges,[$first,$last]; # todo: one element ranges $first=$now; } $last=$now; } pp @ranges;

not sure how you wanna handle one element ranges, so I kept it up to you:

([2, 4], [7, 7], [10, 12])

Cheers Rolf

( addicted to the Perl Programming Language)

Replies are listed 'Best First'.
Re^2: Converting a list of numbers to use a range operator
by Anonymous Monk on Mar 24, 2013 at 13:22 UTC
    OK, very short code, but why does this push @a,"inf" work? Where is this "inf" documented?
      > but why does this push @a,"inf" work?

      inf and -inf are special numeric constants

      DB<159> $a=inf => "inf" DB<160> --$a => "inf" DB<161> ++$a => "inf"

      in this case they are handy, because $now+1 == inf won't raise a warning

      DB<116> use warnings;5=="inf" => "" DB<117> use warnings;5=="WhatEver" Argument "WhatEver" isn't numeric in numeric eq (==) at (eval 47)[mult +i_perl5db.pl:644] line 2.

      > Where is this "inf" documented?

      no idea, I scanned the perldocs for X<inf> w/o success.

      see also Infinity and Inf?

      Cheers Rolf

      ( addicted to the Perl Programming Language)

      UPDATE: deleted wrong example about incrementing inf