Beefy Boxes and Bandwidth Generously Provided by pair Networks Frank
Welcome to the Monastery
 
PerlMonks  

fastest pattern match

by Anonymous Monk
on Jun 24, 2002 at 19:28 UTC ( #176908=perlquestion: print w/ replies, xml ) Need Help??
Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I am a new bie.. I have a file having 50,000 lines. I want to match a pattern. I read the whole file in an array and then match the regex. I want only the line with the first match. the code is something like :-
open( FILE, "file" ) || die ("The file not there "); #open the file with 50,000 lines (some 1MB memory) @list=<FILE>; # put this in an array. close(DICTIONARY); # close the file $regex="somebla.."; #this is the regex to be matched @match=grep(/$regex/,@list); #the above line returns an array of all lines matched # but I want only first one !! Pity don't know how to # get only that.. print $match[0]; #so I get the first match of the retrned array.. #that is poor .grep has to go through the complet list # although I need the first match only
I request the help from perl monks.. With lot of thanks!! Pandey

Comment on fastest pattern match
Download Code
Re: fastest pattern match
by neilwatson (Deacon) on Jun 24, 2002 at 19:35 UTC
    Read the file one line at a time. When you hit your match exit:

    open( FILE, "file" ) || die ("The file not there "); while (<>){ if (m/$regex/) { print "matched!\n"; close (FILE); exit; } }

    Neil Watson
    watson-wilson.ca

      You should use m/$regex/o or the regex will be compiled every iteration, slowing things down considerably

      --

      flounder

        Good advice in general,
        but in this case there'll only be one interation.

        Update: Fastolfe's right...my bad...mea culpa

        ~monk d4vis
        #!/usr/bin/fnord

        Incorrect. It will not be compiled on every iteration, but its string form will be compared with its previous string form, to see whether it needs recompiling.

        _____________________________________________________
        Jeff[japhy]Pinyan: Perl, regex, and perl hacker, who'd like a job (NYC-area)
        s++=END;++y(;-P)}y js++=;shajsj<++y(p-q)}?print:??;

        That's JAN-AR-IK..(like generic) Just another Regexp Question.

        Also it might be worth mentioning that meta characters in $regex will still be parsed. Make sure you intended that to happen.

        --

        Brother Frankus.

        ¤

Re: fastest pattern match
by lestrrat (Deacon) on Jun 24, 2002 at 19:38 UTC

    Untested

    #!/usr/local/bin/perl use strict; open( FILE, "file" ) || die $!; while( <FILE> ) { if( /regexp/ ) { print; last; } }

    or better yet ( also untested )

    perl -ne 'print, last if /regexp/' file
      last; that's the command I was trying to remember. Not exit. My head is filled with to much useless information.

      Neil Watson
      watson-wilson.ca

Re: fastest pattern match
by Cody Pendant (Prior) on Jun 25, 2002 at 04:05 UTC
    Just want to note that if this is your actual code:
    open( FILE, "file" ) || die ("The file not there "); [snip] close(DICTIONARY); # close the file
    you're opening one file, then closing another...
    --
    ($_='jjjuuusssttt annootthheer pppeeerrrlll haaaccckkeer')=~y/a-z//s;print;

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (5)
As of 2014-04-18 00:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (460 votes), past polls