2 Stimmen

Gibt es ein Perl-Modul zum Parsen von Zahlen, einschließlich Bereichen?

Gibt es ein Modul, das das für mich erledigt?

Beispiel-Eingabe: 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' keine gültige Eingabe $!" if $1 >= $2;
        for ( $1 .. $2 ) {
        $zahlen{$_}++;
        }
    } else {
        die "'$_' keine gültige Eingabe $!";
    }
    }
    @array = sort { $a <=> $b } keys ( %zahlen );
    if ( defined $max ) {
    for ( @array ) {
        die "Eingabe '0' nicht erlaubt $!" if $_ == 0;
        die "Eingabe ($_) größer als $max nicht erlaubt $!" if $_ > $max;
    }
    }
    return \@array;
}

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

10voto

jkramer Punkte 15030

Bei einer CPAN-Suche nach Zahlenbereich erhalte ich dies, was ziemlich genau das ist, wonach Sie suchen:

Number::Range

Hier ist ein Beispiel, wie Sie das Modul in Ihrer aw_parse-Funktion verwenden können:

$in =~ s/\s+//g; # Leerzeichen entfernen
$in =~ s/(?<=\d)-/../g; # - durch .. ersetzen

my $range = new Number::Range($in); # Bereich erstellen
my @array = sort { $a <=> $b } $range->range; # Array von Zahlen erhalten

Auf das Beispiel aus der Frage angewendet:

Eingabe (max. 20): 2, 5-7, 9, 3, 11-14
2 3 5 6 7 9 11 12 13 14

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X