http://qs321.pair.com?node_id=255525

hideki-san has asked for the wisdom of the Perl Monks concerning the following question:

I have an array called @remaining and a string called $righteq. I want to store any functions that are not + and -signs into the array. Also, the function e^(t plus or minus a number), otherwise known as "e\^\(t[\+-](\d+\.?\d*|\.\d+)\)" is a special case. I want to detect such a special case, and store it into the array.
$righteq examples: +++-+++t^n+++f^n+e^(t-123.22) or t^n+--++-+f^n++e^(t-123.22)++ or +++++---+t^n+f^n+++e^(t-123.22)-
After processing $righteq, the array looks like this:
$remaining[0] is "t^n" $remaining[1] is "f^n" $remaining[2] is "e^(t-123.22)"

edited: Mon May 5 01:41:45 2003 by jeffa - code tags (no br tags)

Replies are listed 'Best First'.
Re: find, then store functions into array problem
by pfaut (Priest) on May 04, 2003 at 22:57 UTC

    This appears to do what you need.

    #!/usr/bin/perl -w use strict; while (my $righteq = <DATA>) { my @remaining = $righteq =~ /([a-z]\^(?:[a-z]|\([a-z][+-]\d+(?:\.\ +d+)?\)))/g; print '$remaining[',$_,'] is ',$remaining[$_],$/ for 0..$#remainin +g; } __DATA__ +++-+++t^n+++f^n+e^(t-123.22) t^n+--++-+f^n++e^(t-123.22)++ +++++---+t^n+f^n+++e^(t-123.22)-

    Output:

    $remaining[0] is t^n $remaining[1] is f^n $remaining[2] is e^(t-123.22) $remaining[0] is t^n $remaining[1] is f^n $remaining[2] is e^(t-123.22) $remaining[0] is t^n $remaining[1] is f^n $remaining[2] is e^(t-123.22)

    Update: changed to read into $righteq instead of using $_.

    90% of every Perl application is already written.
    dragonchild
      What do I change in your code snippet if the raw data is $righteq, not __DATA__?
Re: find, then store functions into array problem
by Zaxo (Archbishop) on May 04, 2003 at 22:42 UTC

    To extract the strings that are not + or -,

    my @remaining = grep {defined} split /[+-]{2,}/, $righteq; # fixed 2nd arg error

    I assume you don't mean for these functions to be in perl, since your ^ appears to be exponentiation.

    A more detailed regex for your special case can be constructed. Left as an exercise for the reader.

    Update: Ok, using your regex:

    my @remaining = grep {defined} split / (e\^\(t\+-(\d+\.?\d*|\.\d+)\)) # the special, captured | # or else [+-]+ # filler, not captured /x, $righteq;

    After Compline,
    Zaxo