Beefy Boxes and Bandwidth Generously Provided by pair Networks
Pathologically Eclectic Rubbish Lister
 
PerlMonks  

Re^2: Help understand why this grep does not work

by LanX (Saint)
on Nov 02, 2013 at 15:54 UTC ( [id://1060948]=note: print w/replies, xml ) Need Help??


in reply to Re: Help understand why this grep does not work
in thread Help understand why this grep does not work

if speed matters you should better consider something like building a hash for array2 for simple lookups or at least a complex OR-ed regex looping just once over array2.

edit
DB<102> @data1 = ( "a 1 a", "a 2 T", "a 3 C" ); => ("a 1 a", "a 2 T", "a 3 C") DB<103> @data2 = ( "a 2 Y", "a 3 R", "a 4 Q", "b 5 R" ); => ("a 2 Y", "a 3 R", "a 4 Q", "b 5 R") DB<104> $regex = join "|" , map {/^(\w\s+\d)/} @data1 => "a 1|a 2|a 3" DB<105> grep { /^($regex)/ } @data2 => ("a 2 Y", "a 3 R")

think I spotted (and corrected) a bug in your logic, you forgot to anchor to string start '^' in your grep regex.

Cheers Rolf

( addicted to the Perl Programming Language)

Replies are listed 'Best First'.
Re^3: Help understand why this grep does not work
by drmrgd (Beadle) on Nov 02, 2013 at 16:15 UTC
    I wondered about building a hash for this. What would be the best way? Are you thinking something like this is better:
    my %data_hash = map { /(\w\s+\d)/ => $_ } @data2; for my $key ( %data_hash ) { print "$data_hash{$key}\n" if grep { /^$key/ } @data1; }

    I also wondered about anchoring that match. In earlier versions, I did anchor it. But, I wasn't sure if it was necessary given the data set. I think I'll add it back as it's probably safer.

    Thanks for the advice!

      well kind of ... but your code only works if the first 2 chars combinations are unique otherwise you need to push into a HoA.

      I think the or-ed regex I've shown you is better, as long as @data1 is known from the beginning and doesn't change dynamically.

      Cheers Rolf

      ( addicted to the Perl Programming Language)

        Yes, this is why I didn't do that in the first place. Although with the data I have listed I think this would work, if I had to expand it and there weren't unique values, you're right - this wouldn't work so well. I think your 'or-ed regex' is indeed better.

        For the sake of argument (I'm just playing around trying to get better a handling data in Perl and the map function), what's the best way to create a hash of arrays with this data? I can't seem to create the data structure with a map. I know this won't work as it overwrites the values on each pass:

        my %data_hash = map { /^(\w\s+\d)/ => [$_] } @data2;

        But, I can't seem to figure out how to create a hash of arrays with the map function. Maybe it's not possible or not the best way?

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (3)
As of 2024-04-24 05:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found