line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package String::ProperCase::Surname; |
2
|
3
|
|
|
3
|
|
47663
|
use strict; |
|
3
|
|
|
|
|
6
|
|
|
3
|
|
|
|
|
123
|
|
3
|
3
|
|
|
3
|
|
16
|
use warnings; |
|
3
|
|
|
|
|
7
|
|
|
3
|
|
|
|
|
100
|
|
4
|
3
|
|
|
3
|
|
19
|
use base qw{Exporter}; |
|
3
|
|
|
|
|
10
|
|
|
3
|
|
|
|
|
1965
|
|
5
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
our $VERSION='0.03'; |
7
|
|
|
|
|
|
|
our @EXPORT=qw(ProperCase); |
8
|
|
|
|
|
|
|
our @EXPORT_OK=qw(ProperCase); |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
=head1 NAME |
11
|
|
|
|
|
|
|
|
12
|
|
|
|
|
|
|
String::ProperCase::Surname - Converts Surnames to Proper Case |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
=head1 SYNOPSIS |
15
|
|
|
|
|
|
|
|
16
|
|
|
|
|
|
|
use String::ProperCase::Surname; |
17
|
|
|
|
|
|
|
print ProperCase($surname); |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
=head1 DESCRIPTION |
20
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
The package String::ProperCase::Surname is an L that exports exactly one function called ProperCase. The ProperCase function is for use on Surnames which handles cases like O'Neal, O'Brien, McLean, etc. |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
After researching the proper case issues there are three different use cases with a wide variety of loose rules. This algorithm is customized for surnames. Other uses such as "TitleCase" and "MenuCase" have different algorithms. The main difference is that in surnames the letter following an apostrophe is always uppercase (e.g. "O'Brien") in title case and menu case the letter is always lowercase (e.g. "They're"). |
24
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
=head1 USAGE |
26
|
|
|
|
|
|
|
|
27
|
|
|
|
|
|
|
use String::ProperCase::Surname; |
28
|
|
|
|
|
|
|
print ProperCase($surname); |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
OR |
31
|
|
|
|
|
|
|
|
32
|
|
|
|
|
|
|
require String::ProperCase::Surname; |
33
|
|
|
|
|
|
|
print String::ProperCase::Surname::ProperCase($surname); |
34
|
|
|
|
|
|
|
|
35
|
|
|
|
|
|
|
OR |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
use String::ProperCase::Surname qw{}; |
38
|
|
|
|
|
|
|
*pc=\&String::ProperCase::Surname::ProperCase; |
39
|
|
|
|
|
|
|
print pc($surname); |
40
|
|
|
|
|
|
|
|
41
|
|
|
|
|
|
|
=head1 VARIABLES |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
=cut |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
#List of default mixed case surnames (excluding Mc surnames). |
46
|
|
|
|
|
|
|
|
47
|
|
|
|
|
|
|
our @surname=qw{ |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
AbuArab |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
DaSilva DeAnda DeAngelo DeBardelaben DeBary DeBaugh DeBeck DeBergh DeBerry |
52
|
|
|
|
|
|
|
DeBlanc DeBoe DeBoer DeBonis DeBord DeBose DeBostock DeBourge DeBroux DeBruhl |
53
|
|
|
|
|
|
|
DeBruler DeButts DeCaires DeCamp DeCarolis DeCastro DeCay DeConinck DeCook |
54
|
|
|
|
|
|
|
DeCoppens DeCorte DeCost DeCosta DeCoste DeCoster DeCouto DeFamio DeFazio DeFee |
55
|
|
|
|
|
|
|
DeFluri DeFord DeForest DeFraia DeFrange DeFree DeFrees DeGarmo DeGear DeGeare |
56
|
|
|
|
|
|
|
DeGnath DeGraff DeGraffenreid DeGrange DeGraw DeGrenier DeGroft DeGuaincour |
57
|
|
|
|
|
|
|
DeHaan DeHaas DeHart DeHass DeHate DeHaven DeHeer DeHerrera DeJarnette DeJean |
58
|
|
|
|
|
|
|
DeLaet DelAmarre DeLancey DeLara DeLarm DelAshmutt DeLaughter DeLay DeLespine |
59
|
|
|
|
|
|
|
DelGado DelGaudio DeLong DeLony DeLorenzo DeLozier DelPrincipe DelRosso DeLuca |
60
|
|
|
|
|
|
|
DeLude DeLuke DeMaio DeMarchi DeMarco DeMarcus DeMarmein DeMars DeMartinis DeMay |
61
|
|
|
|
|
|
|
DeMello DeMonge DeMont DeMontigny DeMoss DeNunzio DeNure DePalma DePaola |
62
|
|
|
|
|
|
|
DePasquale DePauli DePerno DePhillips DePoty DePriest DeRatt DeRemer DeRosa |
63
|
|
|
|
|
|
|
DeRosier DeRossett DeSaegher DeSalme DeShane DeShano DeSilva DeSimencourt |
64
|
|
|
|
|
|
|
DeSimone DesJardins DeSoto DeSpain DesPlanques DeSplinter DeStefano DesVoigne |
65
|
|
|
|
|
|
|
DeTurck DeVall DeVane DeVaughan DeVaughn DeVaul DeVault DeVenney DeVilbiss |
66
|
|
|
|
|
|
|
DeVille DeVillier DeVinney DeVito DeVore DeVorss DeVoto DeVries DeWald DeWall |
67
|
|
|
|
|
|
|
DeWalt DeWilfond DeWinne DeWitt DeWolf DeYarmett DeYoung DiBenedetto DiCicco |
68
|
|
|
|
|
|
|
DiClaudio DiClemento DiFrisco DiGiacomo DiGiglio DiGraziano DiGregorio |
69
|
|
|
|
|
|
|
DiLiberto DiMarco DiMarzo DiPaolo DiPietrantonio DiStefano DoBoto DonSang |
70
|
|
|
|
|
|
|
DuBois DuBose DuBourg DuCoin DuPre DuPuy |
71
|
|
|
|
|
|
|
|
72
|
|
|
|
|
|
|
DeVaux DeVoir |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
EnEarl |
75
|
|
|
|
|
|
|
|
76
|
|
|
|
|
|
|
FitzJames FitzRandolf |
77
|
|
|
|
|
|
|
|
78
|
|
|
|
|
|
|
LaBarge LaBarr LaBelle LaBonte LaBounty LaBrue LaCaille LaCasse LaChapelle |
79
|
|
|
|
|
|
|
LaClair LaCombe LaCount LaCour LaCourse LaCroix LaFarge LaFeuillande LaFlamme |
80
|
|
|
|
|
|
|
LaFollette LaFontaine LaForge LaForme LaForte LaFosse LaFountain LaFoy LaFrance |
81
|
|
|
|
|
|
|
LaFuze LaGaisse LaGreca LaGuardia LaHaise LaLande LaLanne LaLiberte LaLonde |
82
|
|
|
|
|
|
|
LaLone LaMaitre LaMatry LaMay LaMere LaMont LaMotte LaMunyon LaPierre LaPlante |
83
|
|
|
|
|
|
|
LaPointe LaPorte LaPrade LaPrairie LaQue LaRoche LaRochelle LaRose LaRue |
84
|
|
|
|
|
|
|
LaSalle LaSance LaSart LaTray LaVallee LaVeau LaVenia LaVigna LeBerth LeBlond |
85
|
|
|
|
|
|
|
LeBoeuf LeBreton LeCaire LeCapitain LeCesne LeClair LeClaire LeClerc LeCompte |
86
|
|
|
|
|
|
|
LeConte LeCour LeCrone LeDow LeDuc LeFevre LeFlore LeFors LeFridge LeGrand |
87
|
|
|
|
|
|
|
LeGras LeGrove LeJeune LeMaster LeMesurier LeMieux LeMoine LePage LeQuire LeRoy |
88
|
|
|
|
|
|
|
LeStage LeSuer LeVally LeVert LiConti LoManto LoMastro LoRusso |
89
|
|
|
|
|
|
|
|
90
|
|
|
|
|
|
|
MacAlister MacAlpine MacArthur MacAulay MacAulay MacAuliffe MacBain MacBean |
91
|
|
|
|
|
|
|
MacBeth MacCallum MacClaine MacCauley MacClelland MacCleery MacCloud MacCord |
92
|
|
|
|
|
|
|
MacCray MacDonald MacDonnell MacDougall MacDuff MacDuffie MacFadyen MacFarland |
93
|
|
|
|
|
|
|
MacFarlane MacFie MacGillivray MacGregor MacInnes MacIntyre MacKay MacKenzie |
94
|
|
|
|
|
|
|
MacKinley MacKinnon Mackintosh MacKinney MacLaine MacLachlan MacLaren |
95
|
|
|
|
|
|
|
MacLaughlin MacLea MacLean MacLellan MacLeod MacMahon MacMillan MacNab |
96
|
|
|
|
|
|
|
MacNaught MacNeal MacNeil MacNeill MacNicol MacPhee MacPherson MacQuarrie |
97
|
|
|
|
|
|
|
MacRae MacShane MacSporran MacTavish MacThomas MacWhirter MacAtee MacCarthy |
98
|
|
|
|
|
|
|
MacCarty MacCleverty MacCredie MacCue MacCurrach MacEachern MacGilvray MacIvor |
99
|
|
|
|
|
|
|
MacKechnie MacLennan MacLucas MacManus MacMartin MacNeary MacNevin MacQueen |
100
|
|
|
|
|
|
|
MacWilliams MaDej MaGaw |
101
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
SanFillipo SanGalli SantaLucia |
103
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
TePas |
105
|
|
|
|
|
|
|
|
106
|
|
|
|
|
|
|
VanArsdale VanBuren VanCamp VanCleave VanDalsem VanderLey VanderNeut VanderTol |
107
|
|
|
|
|
|
|
VanderWegen VanDerWeyer VanderWilligen VanDevelde VandeWege VanDolah VanDusen |
108
|
|
|
|
|
|
|
VanDyke VanHee VanHoak VanHook VanHoose VanHouten VanHouwe VanHoven VanKampen |
109
|
|
|
|
|
|
|
VanKleck VanKleeck VanKuiken VanLanduyt VanLeer VanLiere VanLuven VanMeter |
110
|
|
|
|
|
|
|
VanOlinda VanOrmer VanPelt VanSchaick VanSciver VanScoy VanScoyk VanSickle |
111
|
|
|
|
|
|
|
VanTassel VanTuyl VanValkenburg VanVolkenburgh VanWinkle VanWysenberghe |
112
|
|
|
|
|
|
|
VanZandt VenDerWeyer VonCannon |
113
|
|
|
|
|
|
|
|
114
|
|
|
|
|
|
|
}; |
115
|
|
|
|
|
|
|
|
116
|
|
|
|
|
|
|
=head2 %surname |
117
|
|
|
|
|
|
|
|
118
|
|
|
|
|
|
|
You can add or delete custom mixed case surnames to/from this hash. |
119
|
|
|
|
|
|
|
|
120
|
|
|
|
|
|
|
Delete |
121
|
|
|
|
|
|
|
|
122
|
|
|
|
|
|
|
delete($String::ProperCase::Surname::surname{lc($_)}) foreach qw{MacDonald MacLeod}; |
123
|
|
|
|
|
|
|
|
124
|
|
|
|
|
|
|
Add |
125
|
|
|
|
|
|
|
|
126
|
|
|
|
|
|
|
$String::ProperCase::Surname::surname{lc($_)}=$_ foreach qw{DaVis}; |
127
|
|
|
|
|
|
|
|
128
|
|
|
|
|
|
|
Note: All keys are lower case and values are mixed case. |
129
|
|
|
|
|
|
|
|
130
|
|
|
|
|
|
|
=cut |
131
|
|
|
|
|
|
|
|
132
|
|
|
|
|
|
|
our %surname=map {lc($_) => $_} @surname; |
133
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
=head1 FUNCTIONS |
135
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
=head2 ProperCase |
137
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
Function returns the correct case given a surname. |
139
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
print ProperCase($surname); |
141
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
Note: All "Mc" last names are assumed to be mixed case. |
143
|
|
|
|
|
|
|
|
144
|
|
|
|
|
|
|
=cut |
145
|
|
|
|
|
|
|
|
146
|
|
|
|
|
|
|
sub ProperCase { |
147
|
29
|
|
|
29
|
1
|
60
|
my $string=""; |
148
|
29
|
|
|
|
|
149
|
foreach my $part (split /\b/, shift()) { |
149
|
59
|
100
|
|
|
|
209
|
if ($part=~m/^(Mc)([a-z].*)/i) { #Mc |
|
|
100
|
|
|
|
|
|
150
|
5
|
|
|
|
|
16
|
$string.=ucfirst(lc($1)) . ucfirst(lc($2)); |
151
|
|
|
|
|
|
|
} elsif ($surname{lc($part)}) { #MacCleery, DeVaux, etc. |
152
|
12
|
|
|
|
|
34
|
$string.=$surname{lc($part)}; |
153
|
|
|
|
|
|
|
} else { |
154
|
42
|
|
|
|
|
90
|
$string.=ucfirst(lc($part)); |
155
|
|
|
|
|
|
|
} |
156
|
|
|
|
|
|
|
} |
157
|
29
|
|
|
|
|
131
|
return $string; |
158
|
|
|
|
|
|
|
} |
159
|
|
|
|
|
|
|
|
160
|
|
|
|
|
|
|
=head1 BUGS |
161
|
|
|
|
|
|
|
|
162
|
|
|
|
|
|
|
Log on RT and email the Author |
163
|
|
|
|
|
|
|
|
164
|
|
|
|
|
|
|
=head1 LIMITATIONS |
165
|
|
|
|
|
|
|
|
166
|
|
|
|
|
|
|
Surname default mixed case hash will never be perfect for every implementation. |
167
|
|
|
|
|
|
|
|
168
|
|
|
|
|
|
|
=head1 SUPPORT |
169
|
|
|
|
|
|
|
|
170
|
|
|
|
|
|
|
DavisNetworks.com supports all Perl applications including this package. |
171
|
|
|
|
|
|
|
|
172
|
|
|
|
|
|
|
=head1 AUTHOR |
173
|
|
|
|
|
|
|
|
174
|
|
|
|
|
|
|
Michael R. Davis |
175
|
|
|
|
|
|
|
CPAN ID: MRDVT |
176
|
|
|
|
|
|
|
qw/perl michaelrdavis com/ |
177
|
|
|
|
|
|
|
http://www.davisnetworks.com/ |
178
|
|
|
|
|
|
|
|
179
|
|
|
|
|
|
|
=head1 COPYRIGHT |
180
|
|
|
|
|
|
|
|
181
|
|
|
|
|
|
|
This program is free software licensed under the... |
182
|
|
|
|
|
|
|
|
183
|
|
|
|
|
|
|
The BSD License |
184
|
|
|
|
|
|
|
|
185
|
|
|
|
|
|
|
The full text of the license can be found in the LICENSE file included with this module. |
186
|
|
|
|
|
|
|
|
187
|
|
|
|
|
|
|
=head1 SEE ALSO |
188
|
|
|
|
|
|
|
|
189
|
|
|
|
|
|
|
L, L |
190
|
|
|
|
|
|
|
|
191
|
|
|
|
|
|
|
=cut |
192
|
|
|
|
|
|
|
|
193
|
|
|
|
|
|
|
1; |