If it were my surname you were mauling, I'd be more than a bit annoyed. I get enough of my surname's Anglicised (actually Brazilinated, but it's close enough) form being auto-"corrected" into the original Russian. I am actually capable of spelling it correctly, and I do just that.
That said, you could
$surname =~ s/^((?:Mc|Mac|De|Da|Du)?)(.*)$/\u\1\u\2/i;
(assumes the surname starts off lower-cased).
Other problems: not smart enough. E.g. <samp>'mack'</samp> becomes <samp>'MacK'</samp>, which is wrong; you might want .{3,} instead of .* in the regexp.
But I really don't think you should be doing this...
| [reply] [d/l] [select] |
Wel, depending on whether you're validating (i.e. someone submits their name and you want th check if it's in the database or not) or doing something for each entry in a query (give me a list of every person in the database who likes cheeseburgers), you could just canonicalize in your query. Observe:
$sth=$dbh->prepare(qq(select * from table where lower(last_name)=?)) o
+r die "$dbh->errstr";
my ($new_last_name = $last_name) =~ tr/[A-Z]/[a-z]/;
$sth->execute($new_last_name) or die "$dbh->errstr";
Now, you can store the names on the database how ever you want, do your query, and return what the user actually entered in as their name (many have made the point that they know how to spell their own name). By translating both your string and what's on the database to lowercase, you are going to find the match regardless of what case it is on the database. Be warned though that this basically destroys any indexing that you may have had on that field, because the database doesn't know what the results of the lower() function will be until it actually does it. So, it must do it on every record on the table. | [reply] [d/l] |