Beefy Boxes and Bandwidth Generously Provided by pair Networks
Do you know where your variables are?
 
PerlMonks  

Re: Text matching repost

by Neighbour (Friar)
on Jun 18, 2012 at 09:29 UTC ( #976798=note: print w/ replies, xml ) Need Help??


in reply to Text matching repost

How about a different approach?

#!/usr/bin/perl use strict; use warnings; my ($start, $stop) = (qr '#ifdef|#if defined', qr '#endif'); open INPUT, '<', 'monks23.dat' or die "Error opening input: " . $!; while (<INPUT>) { if (/$start/ .. /$stop/) { # Print the lines themselves if (/$start/ or /$stop/) { print; } # Skip the rest next; } print; } close INPUT;
Glad I've finally found a useful non-numeric-iterating purpose for .. :)
Edit: Added comments, removed unnecessary regex escaping


Comment on Re: Text matching repost
Select or Download Code
Replies are listed 'Best First'.
Re^2: Text matching repost
by Neighbour (Friar) on Jun 18, 2012 at 12:19 UTC
    I later realised that instead of using
    if (/$start/ or /$stop/) { print; }
    I could just as well use (and more efficient too):
    if ($&) { print; }
    The meaning of $& is explained in perlvar as
    The string matched by the last successful pattern match.
    You can also use $MATCH if you use English;
      I could just as well use (and more efficient too):
      if ($&) { print; }

      Ummm, no. $& is one of the "ugly three" variables (the other two are $` and $') that kill performance. From perlvar:

      The use of this variable anywhere in a program imposes a considerable performance penalty on all regular expression matches. To avoid this penalty, you can extract the same substring by using @-. Starting with Perl 5.10, you can use the /p match flag and the ${^MATCH} variable to do the same thing for particular match operations.

      Apart from that, it may work for this special problem, but it does not work if $& evaluates to false:

      perl -E '$x="a0b"; $x=~/0/; say $&; if ($&) { die "not reached!" } if + ($x=~/0/) { say "matched zero" }'

      Output:

      0 matched zero

      Alexander

      --
      Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so". ;-)
        Good call, it shall be
        if (scalar @-) { print; }
        then :)
Re^2: Text matching repost
by prassi (Acolyte) on Jun 18, 2012 at 10:45 UTC
    Hi,

    What kind of regex is this the above you mentioned, can you point me to some document on more understanding on this.

    Thanks,

    -Prassi

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (11)
As of 2015-07-28 23:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (260 votes), past polls