Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

regex to an array , is there a better way to do this

by baxy77bax (Deacon)
on Jul 08, 2009 at 16:29 UTC ( [id://778333]=perlquestion: print w/replies, xml ) Need Help??

baxy77bax has asked for the wisdom of the Perl Monks concerning the following question:

hi,

is there a better (simpler) way then this one to chomp some input from STDIN and turn it into an array

chomp(my $number = <STDIN>); my @notSee = split(",", $number); my @array; foreach my $numb (@notSee){ my @arraydigit; if ($numb=~/(\d+)\.\.(\d+)/){ for (my $i=$1;$i<=$2;$i++){ push @arraydigit, $i; } } else{ push @array, $numb; } push @array, @arraydigit; } print "@array\n";
so the input should be : 1,2,4,6..18,47,49,55..65,90 and the output 1 2 4 6 7 8 9 10 11 12 13 14 15 16 17 18 47 49 55 56 57 58 59 60 61 62 63 64 65 90 any suggestions are appreciated.

thnx

Replies are listed 'Best First'.
Re: regex to an array , is there a better way to do this
by moritz (Cardinal) on Jul 08, 2009 at 16:42 UTC
    Your input happens to be valid Perl syntax, so if you know exactly that your input is in this format (and contains no evil things), you can simply write:
    my @array = eval $number;

    Or you could simplify your code a bit:

    for (my $i=$1;$i<=$2;$i++){ push @arraydigit, $i; }

    Can be written shorter and clearer as

    push @array, $1..$2;

    There's really no point in having @array and @arraydigit separate.

Re: regex to an array , is there a better way to do this
by ikegami (Patriarch) on Jul 08, 2009 at 17:11 UTC
    my @array = map { /^(\d+)\.\.(\d+)$/ ? $1..$2 : $_ } split /,/, $seq;

    If you're worried about overlaps and/or duplicates,

    my %seen; my @array = grep !$seen{$_}++, sort { $a <=> $b } map { /^(\d+)\.\.(\d+)$/ ? $1..$2 : $_ } split /,/, $seq;
Re: regex to an array , is there a better way to do this
by ramlight (Friar) on Jul 08, 2009 at 17:11 UTC
    You can even cut it down to
    chomp(my $number = <STDIN>); my @array; foreach (split(",", $number)) { push @array, /(\d+)\.\.(\d+)/ ? $1..$2 : $_; } print "@array\n";
    I don't think it is quite as clear what is going on at this level of compression.
Re: regex to an array , is there a better way to do this
by poolpi (Hermit) on Jul 09, 2009 at 11:10 UTC
    #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use Set::IntSpan; chomp( my $numbers = <STDIN> ); # $numbers = '1,2,4,6..18,47,49,55..65,90'; my $run_list = [ eval $numbers ]; my $set; eval { $set = new Set::IntSpan $run_list }; $@ and print "$@: Try again\n"; my @elem = elements $set; print Dumper \@elem; #Output: # $VAR1 = [ # 1, 2, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, # 47, 49, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 90 # ];


    hth,
    PooLpi

    'Ebry haffa hoe hab im tik a bush'. Jamaican proverb

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://778333]
Approved by moritz
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others imbibing at the Monastery: (2)
As of 2024-11-10 01:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    chatterbot is...






    Results (37 votes). Check out past polls.