File Coverage

blib/lib/Lingua/EN/Infinitive.pm
Criterion Covered Total %
statement 6 70 8.5
branch 0 18 0.0
condition 0 6 0.0
subroutine 2 4 50.0
pod 0 2 0.0
total 8 100 8.0


line stmt bran cond sub pod time code
1             package Lingua::EN::Infinitive;
2              
3             # Name:
4             # Lingua::EN::Infinitive.
5             #
6             # Documentation:
7             # POD-style documentation is at the end. Extract it with pod2html.*.
8             #
9             # Tabs:
10             # 4 spaces || die.
11             #
12             # Author:
13             # Ron Savage
14             # Home page: http://savage.net.au/index.html
15             #
16             # Licence:
17             # Australian copyright (c) 1999-2002 Ron Savage.
18             #
19             # All Programs of mine are 'OSI Certified Open Source Software';
20             # you can redistribute them and/or modify them under the terms of
21             # The Artistic License, a copy of which is available at:
22             # http://www.opensource.org/licenses/index.html
23              
24 1     1   24524 use strict;
  1         3  
  1         47  
25 1     1   5 use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
  1         2  
  1         4238  
26              
27             require Exporter;
28              
29             @ISA = qw(Exporter);
30              
31             # Items to export into callers namespace by default. Note: do not export
32             # names by default without a very good reason. Use EXPORT_OK instead.
33             # Do not simply export all your public functions/methods/constants.
34              
35             @EXPORT = qw();
36              
37             @EXPORT_OK = qw();
38              
39             our $VERSION = '1.11';
40              
41             # Preloaded methods go here.
42             # -------------------------------------------------------------------
43              
44             sub new
45             {
46 0     0 0   my($class) = @_;
47 0   0       $class = ref($class) || $class;
48 0           my($self) = {};
49 0           $self -> {'word1'} = '';
50 0           $self -> {'word2'} = '';
51 0           $self -> {'suffix'} = '';
52 0           $self -> {'rule'} = '';
53 0           $self -> {'irregular2infinitive'} =
54             {
55             'abided' => 'abide',
56             'abode' => 'abide',
57             'am' => 'be',
58             'are' => 'be',
59             'arisen' => 'arise',
60             'arose' => 'arise',
61             'ate' => 'eat',
62             'awaked' => 'awake',
63             'awoke' => 'awake',
64             'bade' => 'bid',
65             'beaten' => 'beat',
66             'became' => 'become',
67             'been' => 'be',
68             'befallen' => 'befall',
69             'befell' => 'befall',
70             'began' => 'begin',
71             'begat' => 'beget',
72             'begot' => 'beget',
73             'begotten' => 'beget',
74             'begun' => 'begin',
75             'beheld' => 'behold',
76             'bent' => 'bend',
77             'bereaved' => 'bereave',
78             'bereft' => 'bereave',
79             'beseeched' => 'beseech',
80             'besought' => 'beseech',
81             'bespoke' => 'bespeak',
82             'bespoken' => 'bespeak',
83             'bestrewed' => 'bestrew',
84             'bestrewn' => 'bestrew',
85             'bestrid' => 'bestride',
86             'bestridden' => 'bestride',
87             'bestrode' => 'bestride',
88             'betaken' => 'betake',
89             'bethought' => 'bethink',
90             'betook' => 'betake',
91             'betted' => 'bet',
92             'bidden' => 'bid',
93             'bided' => 'bide',
94             'bit' => 'bite',
95             'bitten' => 'bite',
96             'bled' => 'bleed',
97             'blended' => 'blend',
98             'blent' => 'blend',
99             'blessed' => 'bless',
100             'blest' => 'bless',
101             'blew' => 'blow',
102             'blown' => 'blow',
103             'bode' => 'bide',
104             'bore' => 'bear',
105             'born' => 'bear',
106             'borne' => 'bear',
107             'bought' => 'buy',
108             'bound' => 'bind',
109             'bred' => 'breed',
110             'broadcasted' => 'broadcast',
111             'broke' => 'break',
112             'broken' => 'break',
113             'brought' => 'bring',
114             'browbeaten' => 'browbeat',
115             'built' => 'build',
116             'burned' => 'burn',
117             'burnt' => 'burn',
118             'came' => 'come',
119             'caught' => 'catch',
120             'chid' => 'chide',
121             'chidden' => 'chide',
122             'chided' => 'chide',
123             'chose' => 'choose',
124             'chosen' => 'choose',
125             'clad' => 'clothe',
126             'clave' => 'cleave',
127             'cleaved' => 'cleave',
128             'cleft' => 'cleave',
129             'clothed' => 'clothe',
130             'clove' => 'cleave',
131             'cloven' => 'cleave',
132             'clung' => 'cling',
133             'costed' => 'cost',
134             'could' => 'can',
135             'crept' => 'creep',
136             'crew' => 'crow',
137             'crowed' => 'crow',
138             'dealt' => 'deal',
139             'did' => 'do',
140             'done' => 'do',
141             'dove' => 'dive',
142             'drank' => 'drink',
143             'drawn' => 'draw',
144             'dreamed' => 'dream',
145             'dreamt' => 'dream',
146             'drew' => 'draw',
147             'driven' => 'drive',
148             'drove' => 'drive',
149             'drunk' => 'drink',
150             'dug' => 'dig',
151             'dwelled' => 'dwell',
152             'dwelt' => 'dwell',
153             'eaten' => 'eat',
154             'fallen' => 'fall',
155             'fed' => 'feed',
156             'fell' => 'fall',
157             'felt' => 'feel',
158             'fled' => 'flee',
159             'flew' => 'fly',
160             'flown' => 'fly',
161             'flung' => 'fling',
162             'forbad' => 'forbid',
163             'forbade' => 'forbid',
164             'forbidden' => 'forbid',
165             'forbore' => 'forbear',
166             'forborne' => 'forbear',
167             'fordid' => 'fordo',
168             'fordone' => 'fordo',
169             'forecasted' => 'forecast',
170             'foregone' => 'forego',
171             'foreknew' => 'foreknow',
172             'foreknown' => 'foreknow',
173             'foreran' => 'forerun',
174             'foresaw' => 'foresee',
175             'foreshowed' => 'foreshow',
176             'foreshown' => 'foreshow',
177             'foretold' => 'foretell',
178             'forewent' => 'forego',
179             'forgave' => 'forgive',
180             'forgiven' => 'forgive',
181             'forgot' => 'forget',
182             'forgotten' => 'forget',
183             'forsaken' => 'forsake',
184             'forseen' => 'foresee',
185             'forsook' => 'forsake',
186             'forswore' => 'forswear',
187             'forsworn' => 'forswear',
188             'fought' => 'fight',
189             'found' => 'find',
190             'froze' => 'freeze',
191             'frozen' => 'freeze',
192             'gainsaid' => 'gainsay',
193             'gave' => 'give',
194             'gilded' => 'gild',
195             'gilt' => 'gild',
196             'girded' => 'gird',
197             'girt' => 'gird',
198             'given' => 'give',
199             'gone' => 'go',
200             'got' => 'get',
201             'gotten' => 'get',
202             'graved' => 'grave',
203             'graven' => 'grave',
204             'grew' => 'grow',
205             'ground' => 'grind',
206             'grown' => 'grow',
207             'had' => 'have',
208             'hamstringed' => 'hamstring',
209             'hamstrung' => 'hamstring',
210             'hanged' => 'hang',
211             'heard' => 'hear',
212             'heaved' => 'heave',
213             'held' => 'hold',
214             'hewed' => 'hew',
215             'hewn' => 'hew',
216             'hid' => 'hide',
217             'hidden' => 'hide',
218             'hove' => 'heave',
219             'hung' => 'hang',
220             'inlaid' => 'inlay',
221             'is' => 'be',
222             'kept' => 'keep',
223             'kneeled' => 'kneel',
224             'knelt' => 'kneel',
225             'knew' => 'know',
226             'knitted' => 'knit',
227             'known' => 'know',
228             'laded' => 'lade',
229             'laden' => 'lade',
230             'laid' => 'lay',
231             'lain' => 'lie',
232             'lay' => 'lie',
233             'leaned' => 'lean',
234             'leant' => 'lean',
235             'leaped' => 'leap',
236             'leapt' => 'leap',
237             'learned' => 'learn',
238             'learnt' => 'learn',
239             'led' => 'lead',
240             'left' => 'leave',
241             'lent' => 'lend',
242             'lighted' => 'light',
243             'lit' => 'light',
244             'lost' => 'lose',
245             'made' => 'make',
246             'meant' => 'mean',
247             'melted' => 'melt',
248             'met' => 'meet',
249             'might' => 'may',
250             'misdealt' => 'misdeal',
251             'misgave' => 'misgive',
252             'misgiven' => 'misgive',
253             'mislaid' => 'mislay',
254             'misled' => 'mislead',
255             'mistaken' => 'mistake',
256             'mistook' => 'mistake',
257             'misunderstood' => 'misunderstand',
258             'molten' => 'melt',
259             'mowed' => 'mow',
260             'mown' => 'mow',
261             'outate' => 'outeat',
262             'outbade' => 'outbid',
263             'outbidden' => 'outbid',
264             'outbred' => 'outbreed',
265             'outdid' => 'outdo',
266             'outdone' => 'outdo',
267             'outeaten' => 'outeat',
268             'outfought' => 'outfight',
269             'outgone' => 'outgo',
270             'outgrew' => 'outgrow',
271             'outgrown' => 'outgrow',
272             'outlaid' => 'outlay',
273             'outran' => 'outrun',
274             'outridden' => 'outride',
275             'outrode' => 'outride',
276             'outsat' => 'outsit',
277             'outshone' => 'outshine',
278             'outshot' => 'outshoot',
279             'outsold' => 'outsell',
280             'outspent' => 'outspend',
281             'outthrew' => 'outthrow',
282             'outthrown' => 'outthrow',
283             'outwent' => 'outgo',
284             'outwore' => 'outwear',
285             'outworn' => 'outwear',
286             'overate' => 'overeat',
287             'overbade' => 'overbid',
288             'overbidden' => 'overbid',
289             'overblew' => 'overblow',
290             'overblown' => 'overblow',
291             'overbore' => 'overbear',
292             'overborn' => 'overbear',
293             'overborne' => 'overbear',
294             'overbought' => 'overbuy',
295             'overbuilt' => 'overbuild',
296             'overcame' => 'overcome',
297             'overdid' => 'overdo',
298             'overdone' => 'overdo',
299             'overdrawn' => 'overdraw',
300             'overdrew' => 'overdraw',
301             'overdriven' => 'overdrive',
302             'overdrove' => 'overdrive',
303             'overeaten' => 'overeat',
304             'overfed' => 'overfeed',
305             'overflew' => 'overfly',
306             'overflown' => 'overfly',
307             'overgrew' => 'overgrow',
308             'overgrown' => 'overgrow',
309             'overhanged' => 'overhang',
310             'overheard' => 'overhear',
311             'overhung' => 'overhang',
312             'overladed' => 'overlade',
313             'overladen' => 'overlade',
314             'overlaid' => 'overlay',
315             'overlain' => 'overlie',
316             'overlay' => 'overlie',
317             'overleaped' => 'overleap',
318             'overleapt' => 'overleap',
319             'overpaid' => 'overpay',
320             'overran' => 'overrun',
321             'overridden' => 'override',
322             'overrode' => 'override',
323             'oversaw' => 'oversee',
324             'overseen' => 'oversee',
325             'oversewed' => 'oversew',
326             'oversewn' => 'oversew',
327             'overshot' => 'overshoot',
328             'overslept' => 'oversleep',
329             'overspent' => 'overspend',
330             'overtaken' => 'overtake',
331             'overthrew' => 'overthrow',
332             'overthrown' => 'overthrow',
333             'overtook' => 'overtake',
334             'overwinded' => 'overwind',
335             'overwound' => 'overwind',
336             'overwritten' => 'overwrite',
337             'overwrote' => 'overwrite',
338             'paid' => 'pay',
339             'partaken' => 'partake',
340             'partook' => 'partake',
341             'prechose' => 'prechoose',
342             'prechosen' => 'prechoose',
343             'proved' => 'prove',
344             'proven' => 'prove',
345             'quitted' => 'quit',
346             'ran' => 'run',
347             'rang' => 'ring',
348             'reaved' => 'reave',
349             'rebuilt' => 'rebuild',
350             'reeved' => 'reeve',
351             'reft' => 'reave',
352             'relaid' => 'relay',
353             'rent' => 'rend',
354             'repaid' => 'repay',
355             'retold' => 'retell',
356             'ridded' => 'rid',
357             'ridden' => 'ride',
358             'risen' => 'rise',
359             'rived' => 'rive',
360             'riven' => 'rive',
361             'rode' => 'ride',
362             'rose' => 'rise',
363             'rove' => 'reeve',
364             'rung' => 'ring',
365             'said' => 'say',
366             'sang' => 'sing',
367             'sank' => 'sink',
368             'sat' => 'sit',
369             'saw' => 'see',
370             'sawed' => 'saw',
371             'sawn' => 'saw',
372             'seen' => 'see',
373             'sent' => 'send',
374             'sewed' => 'sew',
375             'sewn' => 'sew',
376             'shaken' => 'shake',
377             'shaved' => 'shave',
378             'shaven' => 'shave',
379             'sheared' => 'shear',
380             'shined' => 'shine',
381             'shod' => 'shoe',
382             'shoed' => 'shoe',
383             'shone' => 'shine',
384             'shook' => 'shake',
385             'shorn' => 'shear',
386             'shot' => 'shoot',
387             'showed' => 'show',
388             'shown' => 'show',
389             'shrank' => 'shrink',
390             'shredded' => 'shred',
391             'shrived' => 'shrive',
392             'shriven' => 'shrive',
393             'shrove' => 'shrive',
394             'shrunk' => 'shrink',
395             'shrunken' => 'shrink',
396             'slain' => 'slay',
397             'slept' => 'sleep',
398             'slew' => 'slay',
399             'slid' => 'slide',
400             'slidden' => 'slide',
401             'slung' => 'sling',
402             'slunk' => 'slink',
403             'smelled' => 'smell',
404             'smelt' => 'smell',
405             'smitten' => 'smite',
406             'smote' => 'smite',
407             'snuck' => 'sneak',
408             'sold' => 'sell',
409             'sought' => 'seek',
410             'sowed' => 'sow',
411             'sown' => 'sow',
412             'span' => 'spin',
413             'spat' => 'spit',
414             'sped' => 'speed',
415             'speeded' => 'speed',
416             'spelled' => 'spell',
417             'spelt' => 'spell',
418             'spent' => 'spend',
419             'spilled' => 'spill',
420             'spilt' => 'spill',
421             'spoiled' => 'spoil',
422             'spoilt' => 'spoil',
423             'spoke' => 'speak',
424             'spoken' => 'speak',
425             'sprang' => 'spring',
426             'sprung' => 'spring',
427             'spun' => 'spin',
428             'stank' => 'stink',
429             'staved' => 'stave',
430             'stole' => 'steal',
431             'stolen' => 'steal',
432             'stood' => 'stand',
433             'stove' => 'stave',
434             'strewed' => 'strew',
435             'strewn' => 'strew',
436             'stricken' => 'strike',
437             'strid' => 'stride',
438             'stridden' => 'stride',
439             'strived' => 'strive',
440             'striven' => 'strive',
441             'strode' => 'stride',
442             'strove' => 'strive',
443             'struck' => 'strike',
444             'strung' => 'string',
445             'stuck' => 'stick',
446             'stung' => 'sting',
447             'stunk' => 'stink',
448             'sung' => 'sing',
449             'sunk' => 'sink',
450             'sunken' => 'sink',
451             'swam' => 'swim',
452             'sweated' => 'sweat',
453             'swelled' => 'swell',
454             'swept' => 'sweep',
455             'swollen' => 'swell',
456             'swore' => 'swear',
457             'sworn' => 'swear',
458             'swum' => 'swim',
459             'swung' => 'swing',
460             'taken' => 'take',
461             'taught' => 'teach',
462             'thought' => 'think',
463             'threw' => 'throw',
464             'thrived' => 'thrive',
465             'thriven' => 'thrive',
466             'throve' => 'thrive',
467             'thrown' => 'throw',
468             'told' => 'tell',
469             'took' => 'take',
470             'tore' => 'tear',
471             'torn' => 'tear',
472             'trod' => 'tread',
473             'trodden' => 'tread',
474             'unbent' => 'unbend',
475             'unbound' => 'unbind',
476             'unbuilt' => 'unbuild',
477             'underbought' => 'underbuy',
478             'underfed' => 'underfeed',
479             'undergone' => 'undergo',
480             'underlaid' => 'underlay',
481             'underlain' => 'underlie',
482             'underlay' => 'underlie',
483             'underpaid' => 'underpay',
484             'underran' => 'underrun',
485             'undershot' => 'undershoot',
486             'undersold' => 'undersell',
487             'understood' => 'understand',
488             'undertaken' => 'undertake',
489             'undertook' => 'undertake',
490             'underwent' => 'undergo',
491             'underwritten' => 'underwrite',
492             'underwrote' => 'underwrite',
493             'undid' => 'undo',
494             'undone' => 'undo',
495             'undrawn' => 'undraw',
496             'undrew' => 'undraw',
497             'unfroze' => 'unfreeze',
498             'unfrozen' => 'unfreeze',
499             'ungirded' => 'ungird',
500             'ungirt' => 'ungird',
501             'unhanged' => 'unhang',
502             'unhung' => 'unhang',
503             'unknitted' => 'unknit',
504             'unladed' => 'unlade',
505             'unladen' => 'unlade',
506             'unlaid' => 'unlay',
507             'unlearned' => 'unlearn',
508             'unlearnt' => 'unlearn',
509             'unmade' => 'unmake',
510             'unreeved' => 'unreeve',
511             'unrove' => 'unreeve',
512             'unsaid' => 'unsay',
513             'unslung' => 'unsling',
514             'unspoke' => 'unspeak',
515             'unspoken' => 'unspeak',
516             'unstrung' => 'unstring',
517             'unstuck' => 'unstick',
518             'unswore' => 'unswear',
519             'unsworn' => 'unswear',
520             'untaught' => 'unteach',
521             'unthought' => 'unthink',
522             'untrod' => 'untread',
523             'untrodden' => 'untread',
524             'unwinded' => 'unwind',
525             'unwound' => 'unwind',
526             'unwove' => 'unweave',
527             'unwoven' => 'unweave',
528             'upbuilt' => 'upbuild',
529             'upheld' => 'uphold',
530             'uprisen' => 'uprise',
531             'uprose' => 'uprise',
532             'upswept' => 'upsweep',
533             'upswung' => 'upswing',
534             'waked' => 'wake',
535             'was' => 'be',
536             'waylaid' => 'waylay',
537             'wedded' => 'wed',
538             'went' => 'go',
539             'wept' => 'weep',
540             'were' => 'be',
541             'wetted' => 'wet',
542             'winded' => 'wind',
543             'wist' => 'wit',
544             'wot' => 'wit',
545             'withdrawn' => 'withdraw',
546             'withdrew' => 'withdraw',
547             'withheld' => 'withhold',
548             'withstood' => 'withstand',
549             'woke' => 'wake',
550             'woken' => 'wake',
551             'won' => 'win',
552             'wore' => 'wear',
553             'worked' => 'work',
554             'worn' => 'wear',
555             'wound' => 'wind',
556             'wove' => 'weave',
557             'woven' => 'weave',
558             'written' => 'write',
559             'wrote' => 'write',
560             'wrought' => 'work',
561             'wrung' => 'wring',
562             };
563 0           $self -> {'suffix2Rule'} =
564             {
565             'hes' =>
566             { # 'hes' is the suffix.
567             # 'order' is the sort order.
568             # 'rule' is the rule number.
569              
570             # 'word1' == 0 => Use 0, the index of the longest prefix
571             # within @{$prefix{$self->{'suffix'} } }, below.
572              
573             # 'word1' == 1 => Use 1, the index of the 2nd longest prefix
574             # within @{$prefix{$self->{'suffix'} } }, below.
575              
576             # 'word1' == -1 => Use the index of the shortest prefix
577             # within @{$prefix{$self->{'suffix'} } }, below + a letter.
578              
579             # 'word1' == -2 => Use the index of the shortest prefix
580             # within @{$prefix{$self->{'suffix'} } }, below + a letter,
581             # and use the shortest prefix as well.
582              
583             # 'word1' == -3 => Use the index of the shortest prefix
584             # within @{$prefix{$self->{'suffix'} } }, below + meter,
585             # and use the shortest prefix + metre as well.
586              
587             # 'word1' == -4 => Use the original string.
588              
589             'order' => 1011,
590             'rule' => '1',
591             'word1' => 0, # Longest prefix.
592             'suffix1' => '',
593             'suffix2' => '',
594             },
595             'ses' =>
596             {
597             'order' => 1021,
598             'rule' => '2',
599             'word1' => 0, # Longest prefix.
600             'suffix1' => '',
601             'suffix2' => '',
602             },
603             'xes' =>
604             {
605             'order' => 1031,
606             'rule' => '3',
607             'word1' => 0, # Longest prefix.
608             'suffix1' => '',
609             'suffix2' => '',
610             },
611             'zes' =>
612             {
613             'order' => 1041,
614             'rule' => '4',
615             'word1' => 0, # Longest prefix.
616             'suffix1' => '',
617             'suffix2' => '',
618             },
619             'iless' =>
620             {
621             'order' => 1051,
622             'rule' => '43a',
623             'word1' => -1, # Shortest prefix.
624             'suffix1' => 'y',
625             'suffix2' => '',
626             },
627             'less' =>
628             {
629             'order' => 1052,
630             'rule' => '43b',
631             'word1' => -1, # Shortest prefix.
632             'suffix1' => '',
633             'suffix2' => '',
634             },
635             'iness' =>
636             {
637             'order' => 1053,
638             'rule' => '44a',
639             'word1' => -1, # Shortest prefix.
640             'suffix1' => 'y',
641             'suffix2' => '',
642             },
643             'ness' =>
644             {
645             'order' => 1054,
646             'rule' => '44b',
647             'word1' => -1, # Shortest prefix.
648             'suffix1' => '',
649             'suffix2' => '',
650             },
651             "'s" =>
652             {
653             'order' => 1055,
654             'rule' => '7',
655             'word1' => -1, # Shortest prefix.
656             'suffix1' => '',
657             'suffix2' => '',
658             },
659             'ies' =>
660             {
661             'order' => 1056,
662             'rule' => '13a',
663             'word1' => -1, # Shortest prefix.
664             'suffix1' => 'y',
665             'suffix2' => '',
666             },
667             'es' =>
668             {
669             'order' => 1057,
670             'rule' => '13b',
671             'word1' => 0, # Longest prefix.
672             'suffix1' => '',
673             'suffix2' => '',
674             },
675             'ss' =>
676             {
677             'order' => 1061,
678             'rule' => '6a',
679             'word1' => -4, # Original string.
680             'suffix1' => '',
681             'suffix2' => '',
682             },
683             's' =>
684             {
685             'order' => 1062,
686             'rule' => '6b',
687             'word1' => -1, # Shortest prefix.
688             'suffix1' => '',
689             'suffix2' => '',
690             },
691             'ater' =>
692             {
693             'order' => 1081,
694             'rule' => '8',
695             'word1' => -4, # Original string.
696             'suffix1' => '',
697             'suffix2' => '',
698             },
699             'cter' =>
700             {
701             'order' => 1091,
702             'rule' => '9',
703             'word1' => -4, # Original string.
704             'suffix1' => '',
705             'suffix2' => '',
706             },
707             'ier' =>
708             {
709             'order' => 1101,
710             'rule' => '10',
711             'word1' => -1, # Shortest prefix.
712             'suffix1' => 'y',
713             'suffix2' => '',
714             },
715             'er' =>
716             {
717             'order' => 1111,
718             'rule' => '11',
719             'word1' => 0, # Longest prefix.
720             'suffix1' => '',
721             'suffix2' => '',
722             },
723             'ied' =>
724             {
725             'order' => 1121,
726             'rule' => '12a',
727             'word1' => -1, # Shortest prefix.
728             'suffix1' => 'y',
729             'suffix2' => '',
730             },
731             'ed' =>
732             {
733             'order' => 1122,
734             'rule' => '12b', # There is extra code for 12b below.
735             'word1' => 0, # Longest prefix.
736             'suffix1' => '',
737             'suffix2' => '',
738             },
739             'iest' =>
740             {
741             'order' => 1141,
742             'rule' => '14a',
743             'word1' => -1, # Shortest prefix.
744             'suffix1' => 'y',
745             'suffix2' => '',
746             },
747             'est' =>
748             {
749             'order' => 1142,
750             'rule' => '14b',
751             'word1' => -2, # Shortest prefix + a letter, and shortest prefix.
752             'suffix1' => 'e',
753             'suffix2' => '',
754             },
755             'blity' =>
756             {
757             'order' => 1143,
758             'rule' => '21',
759             'word1' => -4, # Original string.
760             'suffix1' => '',
761             'suffix2' => '',
762             },
763             'bility' =>
764             {
765             'order' => 1144,
766             'rule' => '22',
767             'word1' => -1, # Shortest prefix.
768             'suffix1' => 'ble',
769             'suffix2' => '',
770             },
771             'fiable' =>
772             {
773             'order' => 1145,
774             'rule' => '23',
775             'word1' => -1, # Shortest prefix.
776             'suffix1' => 'fy',
777             'suffix2' => '',
778             },
779             'logist' =>
780             {
781             'order' => 1146,
782             'rule' => '24',
783             'word1' => -1, # Shortest prefix.
784             'suffix1' => 'logy',
785             'suffix2' => '',
786             },
787             'ing' =>
788             {
789             'order' => 1151,
790             'rule' => '15', # There is extra code for 15 below.
791             'word1' => -2, # Shortest prefix + a letter, and shortest prefix.
792             'suffix1' => 'e',
793             'suffix2' => '',
794             },
795             'ist' =>
796             {
797             'order' => 1161,
798             'rule' => '16',
799             'word1' => -2, # Shortest prefix + a letter, and shortest prefix.
800             'suffix1' => 'e',
801             'suffix2' => '',
802             },
803             'ism' =>
804             {
805             'order' => 1171,
806             'rule' => '17',
807             'word1' => -2, # Shortest prefix + a letter, and shortest prefix.
808             'suffix1' => 'e',
809             'suffix2' => '',
810             },
811             'ity' =>
812             {
813             'order' => 1181,
814             'rule' => '18',
815             'word1' => -2, # Shortest prefix + a letter, and shortest prefix.
816             'suffix1' => 'e',
817             'suffix2' => '',
818             },
819             'ize' =>
820             {
821             'order' => 1191,
822             'rule' => '19',
823             'word1' => -2, # Shortest prefix + a letter, and shortest prefix.
824             'suffix1' => 'e',
825             'suffix2' => '',
826             },
827             'cable' =>
828             {
829             'order' => 1201,
830             'rule' => '20a',
831             'word1' => -4, # Original string.
832             'suffix1' => '',
833             'suffix2' => '',
834             },
835             'gable' =>
836             {
837             'order' => 1202,
838             'rule' => '20b',
839             'word1' => -4, # Original string.
840             'suffix1' => '',
841             'suffix2' => '',
842             },
843             'able' =>
844             {
845             'order' => 1203,
846             'rule' => '20c',
847             'word1' => -2, # Shortest prefix + a letter, and shortest prefix.
848             'suffix1' => 'e',
849             'suffix2' => '',
850             },
851             'graphic' =>
852             {
853             'order' => 1251,
854             'rule' => '25',
855             'word1' => -1, # Shortest prefix.
856             'suffix1' => 'graphy',
857             'suffix2' => '',
858             },
859             'istic' =>
860             {
861             'order' => 1261,
862             'rule' => '26',
863             'word1' => -1, # Shortest prefix.
864             'suffix1' => 'ist',
865             'suffix2' => '',
866             },
867             'itic' =>
868             {
869             'order' => 1271,
870             'rule' => '27',
871             'word1' => -1, # Shortest prefix.
872             'suffix1' => 'ite',
873             'suffix2' => '',
874             },
875             'like' =>
876             {
877             'order' => 1281,
878             'rule' => '28',
879             'word1' => -1, # Shortest prefix.
880             'suffix1' => '',
881             'suffix2' => '',
882             },
883             'logic' =>
884             {
885             'order' => 1291,
886             'rule' => '29',
887             'word1' => -1, # Shortest prefix.
888             'suffix1' => 'logy',
889             'suffix2' => '',
890             },
891             'ment' =>
892             {
893             'order' => 1301,
894             'rule' => '30',
895             'word1' => -1, # Shortest prefix.
896             'suffix1' => '',
897             'suffix2' => '',
898             },
899             'mental' =>
900             {
901             'order' => 1311,
902             'rule' => '31',
903             'word1' => -1, # Shortest prefix.
904             'suffix1' => 'ment',
905             'suffix2' => '',
906             },
907             'metry' =>
908             {
909             'order' => 1321,
910             'rule' => '32',
911             'word1' => -3, # Shortest prefix + meter, and shortest perfix + metre.
912             'suffix1' => 'meter',
913             'suffix2' => 'metre',
914             },
915             'nce' =>
916             {
917             'order' => 1331,
918             'rule' => '33',
919             'word1' => -1, # Shortest prefix.
920             'suffix1' => 'nt',
921             'suffix2' => '',
922             },
923             'ncy' =>
924             {
925             'order' => 1341,
926             'rule' => '34',
927             'word1' => -1, # Shortest prefix.
928             'suffix1' => 'nt',
929             'suffix2' => '',
930             },
931             'ship' =>
932             {
933             'order' => 1351,
934             'rule' => '35',
935             'word1' => -1, # Shortest prefix.
936             'suffix1' => '',
937             'suffix2' => '',
938             },
939             'ical' =>
940             {
941             'order' => 1361,
942             'rule' => '36',
943             'word1' => -1, # Shortest prefix.
944             'suffix1' => 'ic',
945             'suffix2' => '',
946             },
947             'ional' =>
948             {
949             'order' => 1371,
950             'rule' => '37',
951             'word1' => -1, # Shortest prefix.
952             'suffix1' => 'ion',
953             'suffix2' => '',
954             },
955             'bly' =>
956             {
957             'order' => 1381,
958             'rule' => '38',
959             'word1' => -1, # Shortest prefix.
960             'suffix1' => 'ble',
961             'suffix2' => '',
962             },
963             'ily' =>
964             {
965             'order' => 1391,
966             'rule' => '39',
967             'word1' => -1, # Shortest prefix.
968             'suffix1' => 'y',
969             'suffix2' => '',
970             },
971             'ly' =>
972             {
973             'order' => 1401,
974             'rule' => '40',
975             'word1' => -1, # Shortest prefix.
976             'suffix1' => '',
977             'suffix2' => '',
978             },
979             'iful' =>
980             {
981             'order' => 1411,
982             'rule' => '41a',
983             'word1' => -1, # Shortest prefix.
984             'suffix1' => 'y',
985             'suffix2' => '',
986             },
987             'ful' =>
988             {
989             'order' => 1412,
990             'rule' => '41b',
991             'word1' => -1, # Shortest prefix.
992             'suffix1' => '',
993             'suffix2' => '',
994             },
995             'ihood' =>
996             {
997             'order' => 1421,
998             'rule' => '42a',
999             'word1' => -1, # Shortest prefix.
1000             'suffix1' => 'y',
1001             'suffix2' => '',
1002             },
1003             'hood' =>
1004             {
1005             'order' => 1422,
1006             'rule' => '42b',
1007             'word1' => -1, # Shortest prefix.
1008             'suffix1' => '',
1009             'suffix2' => '',
1010             },
1011             'ification' =>
1012             {
1013             'order' => 1451,
1014             'rule' => '45',
1015             'word1' => -1, # Shortest prefix.
1016             'suffix1' => 'ify',
1017             'suffix2' => '',
1018             },
1019             'ization' =>
1020             {
1021             'order' => 1461,
1022             'rule' => '46',
1023             'word1' => -1, # Shortest prefix.
1024             'suffix1' => 'ize',
1025             'suffix2' => '',
1026             },
1027             'ction' =>
1028             {
1029             'order' => 1471,
1030             'rule' => '47',
1031             'word1' => -1, # Shortest prefix.
1032             'suffix1' => 'ct',
1033             'suffix2' => '',
1034             },
1035             'rtion' =>
1036             {
1037             'order' => 1481,
1038             'rule' => '48',
1039             'word1' => -1, # Shortest prefix.
1040             'suffix1' => 'rt',
1041             'suffix2' => '',
1042             },
1043             'ation' =>
1044             {
1045             'order' => 1491,
1046             'rule' => '49',
1047             'word1' => -1, # Shortest prefix.
1048             'suffix1' => 'ate',
1049             'suffix2' => '',
1050             },
1051             'ator' =>
1052             {
1053             'order' => 1501,
1054             'rule' => '50',
1055             'word1' => -1, # Shortest prefix.
1056             'suffix1' => 'ate',
1057             'suffix2' => '',
1058             },
1059             'ctor' =>
1060             {
1061             'order' => 1511,
1062             'rule' => '51',
1063             'word1' => -1, # Shortest prefix.
1064             'suffix1' => 'ct',
1065             'suffix2' => '',
1066             },
1067             'ive' =>
1068             {
1069             'order' => 1521,
1070             'rule' => '52',
1071             'word1' => -1, # Shortest prefix.
1072             'suffix1' => 'ion',
1073             'suffix2' => '',
1074             },
1075             'onian' =>
1076             {
1077             'order' => 1530,
1078             'rule' => '54',
1079             'word1' => -1, # Shortest prefix.
1080             'suffix1' => 'on',
1081             'suffix2' => '',
1082             },
1083             'an' =>
1084             {
1085             'order' => 1531,
1086             'rule' => '53',
1087             'word1' => -1, # Shortest prefix.
1088             'suffix1' => 'a',
1089             'suffix2' => '',
1090             },
1091             };
1092              
1093 0           return bless $self, $class;
1094              
1095             } # End of new.
1096              
1097             # -------------------------------------------------------------------
1098              
1099             sub stem
1100             {
1101 0     0 0   my($self, $string) = @_;
1102              
1103 0           $self -> {'word1'} = '';
1104 0           $self -> {'word2'} = '';
1105 0           $self -> {'suffix'} = '';
1106 0           $self -> {'rule'} = '';
1107              
1108 0 0         if (defined($self -> {'irregular2infinitive'}{$string}) )
1109             {
1110 0           $self -> {'word1'} = $self -> {'irregular2infinitive'}{$string};
1111 0           $self -> {'rule'} = 'irregular';
1112              
1113 0           return ($self -> {'word1'}, '', '', $self -> {'rule'});
1114             }
1115              
1116 0           my($prefix, $suffix) = ('', '');
1117 0           my($i, $j, $word, %prefix);
1118              
1119             # Build up $prefix{$suffix} as an array of prefixes, from longest to shortest.
1120 0           for ($i = 1; $i < length($string); $i++)
1121             {
1122 0           $prefix = substr($string, 0, $i);
1123 0           $suffix = substr($string, $i);
1124 0           $prefix{$suffix} = [];
1125              
1126 0           for ($j = (length($suffix) - 1); $j >= 0; $j--)
1127             {
1128 0           $word = $prefix . substr($suffix, 0, $j);
1129 0           push(@{$prefix{$suffix} }, $word);
  0            
1130             }
1131             }
1132              
1133             # for $i (sort keys %prefix)
1134             # {
1135             # print "\tSuffix: $i. Prefixes: ", join(' | ', sort @{$prefix{$i} }), ". \n";
1136             # }
1137              
1138 0           my($lastIndex);
1139              
1140 0           for $suffix (
  0            
1141             sort
1142 0           { $self -> {'suffix2Rule'}{$a}{'order'} <=> $self -> {'suffix2Rule'}{$b}{'order'} }
1143             keys(%{$self -> {'suffix2Rule'} }) )
1144             {
1145 0 0         if (defined($prefix{$suffix}) )
1146             {
1147 0           $self -> {'suffix'} = $suffix;
1148 0           $self -> {'rule'} = $self -> {'suffix2Rule'}{$suffix}{'rule'};
1149 0           $i = $self -> {'suffix2Rule'}{$suffix}{'word1'};
1150              
1151 0 0         if ($i == 0)
1152             {
1153 0           $self -> {'word1'} = $prefix{$suffix}[0];
1154 0           $self -> {'word2'} = $prefix{$suffix}[1];
1155             }
1156              
1157 0 0         if ($i == -1)
1158             {
1159 0           $i = $#{$prefix{$suffix} };
  0            
1160 0           $self -> {'word1'} = $prefix{$suffix}[$i] .
1161             $self -> {'suffix2Rule'}{$suffix}{'suffix1'};
1162 0           $self -> {'word2'} = '';
1163             }
1164              
1165 0 0         if ($i == -2)
1166             {
1167 0           $i = $#{$prefix{$suffix} };
  0            
1168 0           $self -> {'word1'} = $prefix{$suffix}[$i] .
1169             $self -> {'suffix2Rule'}{$suffix}{'suffix1'};
1170 0           $self -> {'word2'} = $prefix{$suffix}[$i];
1171             }
1172              
1173 0 0         if ($i == -3)
1174             {
1175 0           $i = $#{$prefix{$suffix} };
  0            
1176 0           $self -> {'word1'} = $prefix{$suffix}[$i] .
1177             $self -> {'suffix2Rule'}{$suffix}{'suffix1'};
1178 0           $self -> {'word2'} = $prefix{$suffix}[$i] .
1179             $self -> {'suffix2Rule'}{$suffix}{'suffix2'};
1180             }
1181              
1182 0 0         if ($i == -4)
1183             {
1184 0           $self -> {'word1'} = $string;
1185 0           $self -> {'word2'} = ''
1186             }
1187              
1188             # Rules 12b and 15: Strip off 'ed' or 'ing'.
1189              
1190 0 0 0       if ( ($self -> {'rule'} eq '12b') || ($self -> {'rule'} eq '15') )
1191             {
1192             # Do we have a monosyllable of this form:
1193             # o 0+ Consonants
1194             # o 1+ Vowel
1195             # o 2 Non-wx
1196             # Eg: tipped => tipp?
1197             # Then return tip and tipp.
1198             # Eg: swimming => swimm?
1199             # Then return tipswim and swimm.
1200              
1201 0 0         if ($self -> {'word2'} =~ /^([^aeiou]*[aeiou]+)([^wx])\2$/)
1202             {
1203 0           $self -> {'word1'} = "$1$2";
1204 0           $self -> {'word2'} = "$1$2$2";
1205             }
1206             }
1207              
1208 0           return ($self -> {'word1'}, $self -> {'word2'}, $suffix, $self -> {'rule'});
1209             }
1210             }
1211              
1212 0           return ('', '', '', '');
1213              
1214             } # End of stem.
1215              
1216             #-------------------------------------------------------------------
1217              
1218             # Autoload methods go after =cut, and are processed by the autosplit program.
1219              
1220             1;
1221              
1222             __END__