perl - 将数值/范围字符串转换为实际值

问题描述:

我想将表格1,2,25-27,4,8,14,7-10的sting转换为实际值列表:1,2,4,7,8,9,10,14,25,26,27perl - 将数值/范围字符串转换为实际值

我搜索了一下,没有发现这种扩展。任何人都知道如何轻松做到这一点?

+3

https://metacpan.org/module/Set::IntSpan – toolic

+0

http://*.com/q/1016766/725418的重复 – TLP

my $s = "1,2,25-27,4,8,14,7-10"; 
my %seen; 
my @arr = 
    sort { $a <=> $b } 
    grep { !$seen{$_}++ } 
    map { 
    my @r = split /-/; 
    @r>1 ? ($r[0] .. $r[1]) : @r; 
    } 
    split /,/, $s; 

print "@arr\n"; 

输出

1 2 4 7 8 9 10 14 25 26 27 
+0

如果你需要它 –

+2

Perl的是我会写的说明这一个坚强!这是优雅的,正是我所期待的。非常感谢你。虽然我无法亲自写下这些内容,但我可以按照自己的方式行事。 – SecondGear

另一种方式来快速做,这是通过使用EVAL的字符串版本。但是你必须记住,使用eval有一些安全隐含的意义,所以你最好在将任何字符串传递给eval之前对其进行清理。

use strict; 
use warnings; 

my $string = "1,2,25-27,4,8,14,7-10"; 

$string =~ s/-/../g; 

my @list = sort {$a <=> $b} keys { map {$_, 1} eval $string }; 

print "@list\n"; 

#output 
1 2 4 7 8 9 10 14 25 26 27