Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^4: using hashes

by R56 (Sexton)
on Sep 26, 2013 at 16:44 UTC ( #1055862=note: print w/replies, xml ) Need Help??


in reply to Re^3: using hashes
in thread iterating hash keys?

It's only partially working, because it's not matching exactly the 'pattern-key'.

Supposing I have both banana AND bananas, being two different names and banana having an ID of 25, he's translating like:

25

25s

I'm guessing the [] exact match operator doesn't work on these cases?

Replies are listed 'Best First'.
Re^5: using hashes
by kennethk (Abbot) on Sep 26, 2013 at 17:44 UTC
    That is a trickier proposition. If you know your words are separated by word boundaries, you can solve your issue with the \b assertion:
    s/\b$find\b/$replace/g
    That will require that either side of your key must correspond to the start or finish of the line, or to the pattern \w\W or \W\w.

    If you can't use word boundaries to delimit, you could try your keys in descending key length.

    for my $line (@lines) { for my $find(sort {length($b) <=> length($a)} keys %ids) { $line =~ s/$find/$ids{$find}/g; } }

    This still has some potential for key overlap, but we'd really need to see you real data to design the correct regex for it. There are a number of ways to cut this up, the choosing the 'right' answer depends strongly on actual input.


    #11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.

      The \b assertion apparently did the trick.

      It will take at least a couple of hours until all is processed (as soon as I get all the basics, I'll start working on my optimization :), but by the looks of it, it looks okay!

      Thanks for all the help and patience Kenneth :)

      Is there a simple way to also contemplate names with hyphens on the middle?
        Hyphens aren't special outside of a character class. What makes you think they are at fault?

        If your 'words' might contain punctuation, you can escape meta characters using quotemeta or synonymously \Q .. \E

        s/\b\Q$find\E\b/$replace/g

        #11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1055862]
help
Chatterbox?
[hippo]: Why not?
[1nickt]: That's good! I suppose the cpanfile would be the same however the app distro is structured ...
[1nickt]: hippo no reason why not other than wanting to check an assumption :-)
[hippo]: For a self-contained application which can therefore ensure thread safety it seems like a sensible approach.
[choroba]: No, if there are no threads, then the user wants to use MCE. If there are threads, the user can choose.

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (13)
As of 2017-10-18 13:18 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    My fridge is mostly full of:

















    Results (244 votes). Check out past polls.

    Notices?