"Well, comparing to what I had, your code is faster than the speed of light!"
That's a good start. :-)
"Is there a simple way for the s// to also include names with hyphens in the middle?"
The short answer is: yes.
The longer answer depends on details.
I found a reference you made to input data with hyphens in "Re^8: using hashes"; however, you provided no indication of the output you wanted (except that 20-10,25 was the wrong output when bana-na,banana was the input).
The following is based on the code I provided earlier.
Given these input files:
$ cat pm_1055846_name_id_data.txt
bananas 456
oranges 23
peaches 897236
kiwis 3726
banana 25
bana 20
bana-na 15
na 10
$ cat pm_1055846_name_replace_data.txt
bananas,oranges
peaches,peaches,peaches
kiwis
oranges
kiwis,oranges,bananas,bananas
bananas,oranges,pineapples,peaches,kiwis
bana-na,banana
ba-na-na,bana-bana,bana-nana
If you want output like this:
$ cat pm_1055846_name_replaced_out.txt
456,23
897236,897236,897236
3726
23
3726,23,456,456
456,23,pineapples,897236,3726
15,25
ba-10-10,20-20,20-nana
Change
my $re = '\b(' . join('|', keys %id_for) . ')\b';
to
my $re = '\b(' . join('|', sort { $b cmp $a } keys %id_for) . ')\b';
If you want output like this:
$ cat pm_1055846_name_replaced_out.txt
456,23
897236,897236,897236
3726
23
3726,23,456,456
456,23,pineapples,897236,3726
15,25
ba-na-na,bana-bana,bana-nana
Change
my $re = '\b(' . join('|', keys %id_for) . ')\b';
to
my $re = '(^|,)(' . join('|', sort { $b cmp $a } keys %id_for) . ')(?=
+,|$)';
and
s/$re/$id_for{$1}/g;
to
s/$re/$1$id_for{$2}/g;
If you want something different to these, and are unable to work it out for yourself, provide details as outlined in the "How do I post a question effectively?" guidelines.
It would also be useful to advise what version of Perl you're using: I wrote those changes for v5.8; a more efficient version could have been written for a later version.
As a hint for doing this yourself, see (?<=pattern) \K under Look-Around Assertions in "perlre: Extended Patterns" — \K was introduced in v5.10.0 (see "perl5100delta: Regular expressions" for this, and other, regex enhancements).
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.