【问题标题】:Is there a Perl module for parsing numbers, including ranges?是否有用于解析数字(包括范围)的 Perl 模块?
【发布时间】:2011-02-18 11:56:09
【问题描述】:

有没有一个模块可以帮我做这个?

样本输入: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";

【问题讨论】:

    标签: perl parsing input module numbers


    【解决方案1】:

    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
    

    【讨论】:

    • 为什么?它正是 sid_com 试图做的事情。
    • @jkramer :这个例子确实澄清了一些事情,我并没有考虑将- s 替换为.. s。已删除反对票。但它本身仍然不能取代 OP 的 aw_parse 子程序。
    • 接受了,尽管这个模块需要一些额外的代码来修改输入并且输入验证不那么严格。
    • 如果您可以定义输入格式,我建议您使用 a..b 语法来代替 a-b。一旦您需要用负数定义范围, a-b 可能会出现问题。它还消除了对正则表达式的需要。
    • 作为 Number::Range 的创建者,我选择 .. for range 的原因是其他语言支持这种格式,以及 @jkramer 建议的原因。
    猜你喜欢
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多