Article 2785 of comp.lang.perl:
Xref: feenix.metronet.com comp.lang.perl:2785
Newsgroups: comp.lang.perl
Path: feenix.metronet.com!news.utdallas.edu!wupost!howland.reston.ans.net!agate!ames!sgi!wdl1!wdl39!mab
From: [email protected] (Mark A Biggar)
Subject: Re: A Faster Grep???
Message-ID: <[email protected]>
Sender: [email protected]
Organization: Loral Western Development Labs
References: <[email protected]>
Date: Fri, 14 May 1993 15:51:57 GMT
Lines: 40

In article <[email protected]> [email protected] (Kevin Vashi) writes:
>   I'm reading a file which has the following content:
>/usr/lib/something_unique1
>/usr/bin/something_unique2
>/usr/lib/something_unique3
>/usr/lib/something_unique4
>/usr/bin/something_unique5
>and so on...
>Now I'd like to have lists which have the same path before something unique.
>I'l like List A to have all the filess+path in /usr/bin and
>list B to have all the files+path in /usr/lib.
>At present I'm using the following piece of code that uses grep
>   while(<>)
>   {
>      @listA = grep(/$path1/,@path_array);
>      @listB = grep(/$path2/,@path_array);
>   }
>Is there anyway I could use associative arrays to speed this code???

I don't think that associative arrays would help, but it can be done
using only 1 grep instead of two:

while(<>) {
    @listA = ();
    @listB = grep(/$path2/ || (/$path1/ && (push(listA,$_),0)), @path_array);
}

If the line matches /$path2/ then the control expression is true and the
line will go into listB, otherwise if /$path1/ then we push the line on listA
and return 0 so the line doesn't end up in listB also.  In addition, lines
that don't match either pattern are ignored.  If your code only does the above
operation once then both patterns should have an o modifier.  If you do it
more then once, you probably want to wrap the grep in an eval to preexpand
the patterns.

--
Perl's Maternal Uncle
Mark Biggar
[email protected]