2010-05-12 35 views
2

有沒有一個模塊,這對我來說呢?是否有Perl模塊用於解析數字,包括範圍?

sample_input:2,5-7,9,3,11-14

#!/usr/bin/env perl 
use warnings; use strict; use 5.012; 

sub aw_parse { 
    my($in, $max) = @_; 
    chomp $in; 
    my @array = split (/\s*,\s*/, $in); 
    my %zahlen; 
    for (@array) { 
    if (/^\s*(\d+)\s*$/) { 
     $zahlen{$1}++; 
    } 
    elsif (/^\s*(\d+)\s*-\s*(\d+)\s*$/) { 
     die "'$1-$2' not a valid input $!" if $1 >= $2; 
     for ($1 .. $2) { 
     $zahlen{$_}++; 
     } 
    } else { 
     die "'$_' not a valid input $!"; 
    } 
    } 
    @array = sort { $a <=> $b } keys (%zahlen); 
    if (defined $max) { 
    for (@array) { 
     die "Input '0' not allowed $!" if $_ == 0; 
     die "Input ($_) greater than $max not allowed $!" if $_ > $max; 
    } 
    } 
    return \@array; 
} 

my $max = 20; 
print "Input (max $max): "; 
my $in = <>; 
my $out = aw_parse($in, $max); 
say "@$out"; 
+0

樣品投入會有所幫助。 – Zaid 2010-05-12 08:10:52

回答

10

一個CPAN搜索number range給了我這一點,這看起來很像你在找什麼:

Number::Range

這裏有一個如何使用該模塊在aw_parse函數的一個例子:

$in =~ s/\s+//g; # remove spaces 
$in =~ s/(?<=\d)-/../g; # replace - with .. 

my $range = new Number::Range($in); # create the range 
my @array = sort { $a <=> $b } $range->range; # get an array of numbers 

應用於從問題的樣本:

Input (max 20): 2, 5-7, 9, 3, 11-14 
2 3 5 6 7 9 11 12 13 14 
+1

爲什麼?它確實是sid_com正在嘗試做的事情。 – jkramer 2010-05-12 08:25:47

+1

+1舉例。 – Space 2010-05-12 08:47:29

+0

@ jkramer:這個例子清除了一些東西,我沒有考慮用'..'來替換'-'。 Downvote刪除。但它本身並不能代替OP的'aw_parse'子程序。 – Zaid 2010-05-12 09:38:17