2010-04-21 66 views
4

我有一個數字數組:如何從Perl中的整數列表中獲取範圍?

@numbers = 1,2,3,6,8,9,11,12,13,14,15,20 

,我想打印這樣說:

1-3,6,8-9,11-15,20 

有什麼想法?當然,我嘗試使用最常見的「循環」,但仍然沒有得到它。

+0

爲什麼'8-9'呀?之間沒有任何關係。它不應該是'1-3,6,8,9,11-15,20'嗎?跳過的模式是什麼? – dawg 2010-04-21 05:46:52

+0

糟糕,應該是8-9。無論如何,已經解決了..謝謝你們! :) – Suezy 2010-04-21 07:21:33

回答

4

這裏是一個可能的方式:

@numbers = (1,2,3,6,8,9,11,12,13,14,15,20); 
@list =(); 
$first = $last = shift @numbers; 
foreach (@numbers,inf) { 
    if ($_ > $last+1) { 
    if ($first == $last) { 
     push @list, $first; 
    } elsif ($first+1 == $last) { 
     push @list, $first, $last; 
    } else { 
     push @list, "$first-$last"; 
    } 
    $first = $_; 
    } 
    $last = $_; 
} 

print join ',', @list; 
+0

謝謝!有效。 :) – Suezy 2010-04-21 07:20:46

12

您可以使用Set::IntSpan::Fast

use Set::IntSpan::Fast; 

my @numbers = (1,2,3,6,8,9,11,12,13,14,15,20); 

my $set = Set::IntSpan::Fast->new; 
$set->add(@numbers); 
print $set->as_string, "\n"; 
+1

有*是*一個模塊的一切! – 2010-04-21 07:54:14

1
@numbers=sort { $a <=> $b } @numbers; 
push @numbers, inf; 

@p=(); 
$ra = shift @numbers; 
$rb = $ra; 
for $n (@numbers) { 
    if ($n > $rb +1) { 
     push @p, ($ra == $rb ? "$ra" : "$ra-$rb"); 

     $ra = $n; 
    } 

    $rb = $n; 
} 

print join(',', @p);