【问题标题】:perl - convert string of numeric values/ranges to actual values [duplicate]perl - 将数值/范围字符串转换为实际值
【发布时间】:2013-10-11 23:44:23
【问题描述】:

我想将1,2,25-27,4,8,14,7-10 形式的字符串转换为实际值列表:1,2,4,7,8,9,10,14,25,26,27

我已经搜索过并没有发现任何可以进行这种扩展的东西。任何人都知道如何轻松做到这一点?

【问题讨论】:

标签: perl string-conversion numeric-ranges


【解决方案1】:
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

【讨论】:

  • 如果你需要我会写解释
  • 这个 perl 很强大!这很优雅,正是我想要的。非常感谢你。虽然我不能自己写,但我可以按照它在做什么。
【解决方案2】:

另一种快速完成此操作的方法是使用 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   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2011-01-09
    • 1970-01-01
    相关资源
    最近更新 更多