XP is just a number PerlMonks

### Re: Converting a list of numbers to use a range operator

by toolic (Bishop)
 on Mar 23, 2013 at 20:43 UTC ( #1025071=note: print w/replies, xml ) Need Help??

I've had this lying around. Is it any less painful?
use warnings; use strict; print ranges(2,3,4,10,11,12), "\n"; sub ranges { my @vals = @_; my \$min = \$vals[0]; my \$max; my @list; for my \$i (0 .. (scalar(@vals)-2)) { if ((\$vals[\$i+1] - \$vals[\$i]) != 1) { \$max = \$vals[\$i]; push @list, (\$min == \$max) ? \$min : "\$min-\$max"; \$min = \$vals[\$i+1]; } } \$max = \$vals[-1]; push @list, (\$min == \$max) ? \$min : "\$min-\$max"; return join ', ', @list; } __END__ 2-4, 10-12

I wonder if Set::IntSpan can do this.

Replies are listed 'Best First'.
Re^2: Converting a list of numbers to use a range operator
by FloydATC (Deacon) on Mar 23, 2013 at 21:22 UTC
Yes!! Set::IntSpan, I knew I'd seen something like that but couldn't remember what it was called!

my @array = (2,3,4,10,11,12); my \$set = new Set::IntSpan join(',', @array); my \$list = \$set->run_list; # \$list is now "2-4,10-12"
Now this... this is not ugly :-)

-- Time flies when you don't know what you're doing

I even love the way Parse::Range does it.
Putting your original \$list in the function parse_range prints out beautifully like so:

use warnings; use strict; use Parse::Range qw(parse_range); my \$list = "2-4,10-12"; print join ','=> parse_range(\$list); # 2,3,4,10,11,12

If you tell me, I'll forget.
If you show me, I'll remember.
if you involve me, I'll understand.
--- Author unknown to me

Create A New User
Node Status?
node history
Node Type: note [id://1025071]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (2)
As of 2018-03-17 06:13 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
When I think of a mole I think of:

Results (223 votes). Check out past polls.

Notices?