Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^5: regex return true instead of false (precedence)

by rsFalse (Hermit)
on Aug 27, 2019 at 16:40 UTC ( #11105131=note: print w/replies, xml ) Need Help??


in reply to Re^4: regex return true instead of false (precedence)
in thread regex return true instead of false

Also you can waste one line of code for making first conditional to have the same line-format as others:
if( not 0 || $args =~ /\-rs(\s+)(\S+)/x # || $args =~ /\-? (\s+)(\S+)/x || $args =~ /\-p (\s+)(\S+)/x || $args =~ /\-P (\s+)(\S+)/x ){ ... }
...or equivalently inside regex:
if( $args !~ / (*FAIL) | \-rs(\s+)(\S+) # | \-? (\s+)(\S+) | \-P (\s+)(\S+) | \-p (\s+)(\S+) /x ){ ... }
edit: not equivalently, because there are 8 capturing groups instead of 2 :)

Of course regex can be simplyfied as AnomalousMonk have shown here Re: regex return true instead of false.

Replies are listed 'Best First'.
Re^6: regex return true instead of false (precedence)
by AnomalousMonk (Bishop) on Aug 27, 2019 at 20:11 UTC
    if( $args !~ / (*FAIL) | \-rs(\s+)(\S+) # | \-? (\s+)(\S+) | \-P (\s+)(\S+) | \-p (\s+)(\S+) /x ){ ... }

    I don't understand the purpose of the  (*FAIL) operator (see Special Backtracking Control Verbs in perlre in Perl versions 5.10+ (update: see also Backtracking control verbs in perlretut - but that's not actually as extensive as the discussion in perlre)) in the quoted regex. At any position in the  | alternation,  (*FAIL) will simply force the RE to try the next alternation; if it's at the last position, all the preceding pattern matches would have failed and the alternation would fail anyway without (*FAIL).

    c:\@Work\Perl\monks>perl -wMstrict -le "use 5.010; ;; for my $s (qw(XXX ppp)) { print qq{for '$s' string}; if ($s !~ m{ (*F) | p | q }xms) { print ' with (*F): no match, !~ +true' } if ($s !~ m{ Z | p | q }xms) { print ' with Z: no match, !~ +true' } if ($s !~ m{ p | q }xms) { print ' no (*F): no match, !~ +true' } print ' -------'; } " for 'XXX' string with (*F): no match, !~ true with Z: no match, !~ true no (*F): no match, !~ true ------- for 'ppp' string -------
    Note that for all these variations, for string 'XXX' there is never a match (!~ is always true); string 'ppp' always matches (!~ always false).

    ... not equivalently, because there are 8 capturing groups instead of 2 ...

    If you're using  (*FAIL) you must be using Perl version 5.10+, so you also have the  (?|pattern) "branch reset" operator (see Extended Patterns in perlre). This allows you to go back to having two capture groups again!

    Update: Changed example code slightly to better reflect discussion.


    Give a man a fish:  <%-{-{-{-<

      "I don't understand the purpose of the (*FAIL) operator" -- AnomalousMonk.

      It has the same purpose as zero in separated regex example. It allows '||' or '|' be written before first conditional. And then all conditionals have the same line-format. For me it is more readable :)

      It is similar to:
      if( 0 ){ ; } elsif( condition_1 ){ ... } elsif( condition_2 ){ ... } elsif( condition_3 ){ ... }
      ...which is sometimes a bit more readable. Also then I can easily change the sequence of conditions by only swapping lines (including the line with the first condition).

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11105131]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (5)
As of 2020-01-20 08:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Notices?