in reply to and or statement

I don't understand the question. Why not just capture what was matched, as in (note that the /g regex modifier is not used; it almost certainly does not do what you expect):

>perl -wMstrict -le "my $element = 'hi WEED ho'; if ($element =~ m{ (WEED|DIAL|PIES|KILLD) }xms) { my $match = $1; print qq{match: '$match'}; } " match: 'WEED'

Replies are listed 'Best First'.
Re^2: and or statement
by endsin1m (Initiate) on Nov 08, 2011 at 00:44 UTC
    sorry what I want to do is return matches of each word in a short statement rather than re iterating through multiple if statements; so that the first match stores the occurrence of each match ie $1 contains weed if matched $2 has dial etc so if the queried scalar contains weed AND dial both are printed. (The code also calls the scalar of the matched file with is the $fasta header part of a foreach loop) or if only one is present one is printed. so match weed and or dial and print the matched quantity. I apologize for being vague I am fairly new at this.

      I'm still a bit vague about your requirements, but something along these lines might serve (note /g regex modifier is required in  m{ ... }xmsg below):

      >perl -wMstrict -le "my @motifs = qw(WEED KILLD DIAL PIES); my $motif = join '|', @motifs; $motif = qr{ $motif }xms; ;; my $element = 'both WEED PIES and DIAL PIES are present'; ;; my %elements = map { $_ => 1 } $element =~ m{ $motif }xmsg ; ;; printf qq{$_ is %spresent \n}, $elements{$_} ? '' : 'NOT ' for @motifs; ;; my @present = keys %elements; print qq{present: @present}; " WEED is present KILLD is NOT present DIAL is present PIES is present present: WEED DIAL PIES

      Update: The  map statement could easily be changed to count the number of occurrences of each 'motif', if that's the correct terminology.

      An AND+OR operator makes no sense. Reductio ad absurdum, let's say such an operator exists and is denoted by -&|-

      Consider:
      if ( (1 == 1) -&|- (1 == 2) ) { # duh! fixed '=' to '==' 8 Nov say "yep! one is equal to one and/or one is equal to two"; }

      For an explanation of alternation in a regex, you'll do well to read perlrequick and perlretut... but pay special attention to the explanation (paraphrased) that the first-matched alternative wins.

      If you want a count of instances of any given sequence which is (or is not) repeated in the data, you'll want to read about hashes ... for instance, in Not Exactly a Hash Tutorial which is found, along with others, in Tutorials.

      And, since you're "fairly new at this," here are a few hints:

      • Until you know exactly why to omit them, use strict and warnings. They'll save you much heartburn over your typos ... and outright syntax errors like...
      • $match = $1||$2||$3||$4; from your OP. $match won't contain what you appear to expect without double-quotes.
      • And speaking of expectations, the Monks expect those who post questions to read the formatting advice re <p>...</p> and <c>...</c> found adjacent to the text-input box where the poster types the question. The code tags advice applies BOTH to code AND to data. See also Markup in the Monastery.

      And, lest this seem a heavy burden, you've already taken the hardest step: starting. Welcome to the Monastery, where you'll find many willing to help with pointers and explanations.