Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

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

by drmrgd (Beadle)
on Nov 02, 2013 at 16:15 UTC ( #1060950=note: print w/ replies, xml ) Need Help??


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

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!


Comment on Re^3: Help understand why this grep does not work
Download Code
Re^4: Help understand why this grep does not work
by LanX (Canon) on Nov 02, 2013 at 16:21 UTC
    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?

        OK, these two three possibilities seem to do it, but by far not as performant as the or-ed regex.

        DB<126> %hash = map { my ($m)=/^(\w\s+\d)/; $m => [ grep {/^$m/} @da +ta2 ] } @data1 => ("a 1", [], "a 2", ["a 2 Y"], "a 3", ["a 3 R"]) DB<127> %hash = map { my $k=$_ ; $k => [ grep {/^$k/} @data2 ] } map + { /^(\w\s+\d)/} @data1 => ("a 1", [], "a 2", ["a 2 Y"], "a 3", ["a 3 R"]) DB<128> %hash = map { /^(\w\s+\d)/; $1 => [ grep {/^$1/} @data2 ] } +@data1 => ("a 1", [], "a 2", ["a 2 Y"], "a 3", ["a 3 R"])

        update

        see also Generating Hash-of-List using map?

        Cheers Rolf

        ( addicted to the Perl Programming Language)

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (16)
As of 2014-09-23 15:31 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (224 votes), past polls