File Coverage

blib/lib/Lingua/RU/Sklon.pm
Criterion Covered Total %
statement 64 138 46.3
branch 24 68 35.2
condition 0 24 0.0
subroutine 12 13 92.3
pod 5 5 100.0
total 105 248 42.3


line stmt bran cond sub pod time code
1             #!/usr/bin/perl -w
2 2     2   44531 use strict;
  2         5  
  2         81  
3 2     2   12 use warnings;
  2         4  
  2         77  
4 2     2   1809 use POSIX qw(locale_h);
  2         25093  
  2         13  
5 2     2   5709 use locale;
  2         515  
  2         12  
6             setlocale(LC_CTYPE, "ru_RU.cp1251");
7            
8             package Lingua::RU::Sklon;
9            
10            
11            
12            
13             BEGIN {
14 2     2   137 use Exporter ();
  2         5  
  2         206  
15 2     2   5 our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
16            
17             # set the version for version checking
18 2         4 $VERSION = 0.01;
19            
20 2         47 @ISA = qw(Exporter);
21 2         6 @EXPORT = qw(&parse_n &parse_lastname &convert &initcap &sklon);
22 2         5 %EXPORT_TAGS = ( );
23            
24             # your exported package globals go here,
25             # as well as any optionally exported functions
26 2         37 @EXPORT_OK = qw(%pads);
27            
28            
29             }
30 2     2   11 use Carp;
  2         3  
  2         6058  
31            
32             our @EXPORT_OK;
33            
34             our %pads;
35            
36             # non-exported package globals go here
37             our $dos;
38             our $iso;
39             our $koi;
40             our $win;
41            
42             # initialize package globals, first exported ones
43            
44             %pads=(
45             I=>1, IMEN=>1, 1=>1, #это жена
46             R=>2, ROD=>2, 2=>2, #отстался без жены
47             D=>3, DAT=>3, 3=>3, #студенту жене
48             V=>4, VIN=>4, 4=>4, #порвал жену
49             T=>5, TVOR=>5, 5=>5, #назвался женой
50             P=>6, PRED=>6, 6=>6 #пишу о жене
51             );
52            
53            
54             $dos={'а'=>160,'б'=>161,'в'=>162,'г'=>163,'д'=>164,'е'=>165,'ё'=>241,'ж'=>166,'з'=>167,'и'=>168,'й'=>169,'к'=>170,'л'=>171,'м'=>172,'н'=>173,'о'=>174,'п'=>175,'р'=>224,'с'=>225,'т'=>226,'у'=>227,'ф'=>228,'х'=>229,'ц'=>230,'ч'=>231,'ш'=>232,'щ'=>233,'ь'=>236,'ы'=>235,'ъ'=>234,'э'=>237,'ю'=>238,'я'=>239,'А'=>128,'Б'=>129,'В'=>130,'Г'=>131,'Д'=>132,'Е'=>133,'Ё'=>240,'Ж'=>134,'З'=>135,'И'=>136,'Й'=>137,'К'=>138,'Л'=>139,'М'=>140,'Н'=>141,'О'=>142,'П'=>143,'Р'=>144,'С'=>145,'Т'=>146,'У'=>147,'Ф'=>148,'Х'=>149,'Ц'=>150,'Ч'=>151,'Ш'=>152,'Щ'=>153,'Ь'=>156,'Ы'=>155,'Ъ'=>154,'Э'=>157,'Ю'=>158,'Я'=>159};
55             $iso={'а'=>208,'б'=>209,'в'=>210,'г'=>211,'д'=>212,'е'=>213,'ё'=>241,'ж'=>214,'з'=>215,'и'=>216,'й'=>217,'к'=>218,'л'=>219,'м'=>220,'н'=>221,'о'=>222,'п'=>223,'р'=>224,'с'=>225,'т'=>226,'у'=>227,'ф'=>228,'х'=>229,'ц'=>230,'ч'=>231,'ш'=>232,'щ'=>233,'ь'=>236,'ы'=>235,'ъ'=>234,'э'=>237,'ю'=>238,'я'=>239,'А'=>176,'Б'=>177,'В'=>178,'Г'=>179,'Д'=>180,'Е'=>181,'Ё'=>161,'Ж'=>182,'З'=>183,'И'=>184,'Й'=>185,'К'=>186,'Л'=>187,'М'=>188,'Н'=>189,'О'=>190,'П'=>191,'Р'=>192,'С'=>193,'Т'=>194,'У'=>195,'Ф'=>196,'Х'=>197,'Ц'=>198,'Ч'=>199,'Ш'=>200,'Щ'=>201,'Ь'=>204,'Ы'=>203,'Ъ'=>202,'Э'=>205,'Ю'=>206,'Я'=>207};
56             $koi={'а'=>193,'б'=>194,'в'=>215,'г'=>199,'д'=>196,'е'=>197,'ё'=>163,'ж'=>214,'з'=>218,'и'=>201,'й'=>202,'к'=>203,'л'=>204,'м'=>205,'н'=>206,'о'=>207,'п'=>208,'р'=>210,'с'=>211,'т'=>212,'у'=>213,'ф'=>198,'х'=>200,'ц'=>195,'ч'=>222,'ш'=>219,'щ'=>221,'ь'=>216,'ы'=>217,'ъ'=>223,'э'=>220,'ю'=>192,'я'=>209,'А'=>225,'Б'=>226,'В'=>247,'Г'=>231,'Д'=>228,'Е'=>229,'Ё'=>179,'Ж'=>246,'З'=>250,'И'=>233,'Й'=>234,'К'=>235,'Л'=>236,'М'=>237,'Н'=>238,'О'=>239,'П'=>240,'Р'=>242,'С'=>243,'Т'=>244,'У'=>245,'Ф'=>230,'Х'=>232,'Ц'=>227,'Ч'=>254,'Ш'=>251,'Щ'=>253,'Ь'=>248,'Ы'=>249,'Ъ'=>255,'Э'=>252,'Ю'=>224,'Я'=>241};
57             $win={'а'=>224,'б'=>225,'в'=>226,'г'=>227,'д'=>228,'е'=>229,'ё'=>184,'ж'=>230,'з'=>231,'и'=>232,'й'=>233,'к'=>234,'л'=>235,'м'=>236,'н'=>237,'о'=>238,'п'=>239,'р'=>240,'с'=>241,'т'=>242,'у'=>243,'ф'=>244,'х'=>245,'ц'=>246,'ч'=>247,'ш'=>248,'щ'=>249,'ь'=>252,'ы'=>251,'ъ'=>250,'э'=>253,'ю'=>254,'я'=>255,'А'=>192,'Б'=>193,'В'=>194,'Г'=>195,'Д'=>196,'Е'=>197,'Ё'=>168,'Ж'=>198,'З'=>199,'И'=>200,'Й'=>201,'К'=>202,'Л'=>203,'М'=>204,'Н'=>205,'О'=>206,'П'=>207,'Р'=>208,'С'=>209,'Т'=>210,'У'=>211,'Ф'=>212,'Х'=>213,'Ц'=>214,'Ч'=>215,'Ш'=>216,'Щ'=>217,'Ь'=>220,'Ы'=>219,'Ъ'=>218,'Э'=>221,'Ю'=>222,'Я'=>223};
58            
59 1     1   1040 END { } # module clean-up code here (global destructor)
60            
61            
62            
63            
64             sub convert {
65 0     0 1 0 my $src=lc shift;
66 0         0 my $tgt=lc shift;
67 0         0 my ($src_cp, $tgt_cp);
68 0 0       0 if ($src eq 'dos') { $src_cp=$dos;
  0 0       0  
    0          
    0          
69 0         0 } elsif ($src eq 'win') { $src_cp=$win;
70 0         0 } elsif ($src eq 'iso') { $src_cp=$iso;
71 0         0 } elsif ($src eq 'koi') { $src_cp=$koi;
72             } else {
73 0         0 croak "Wrong Source encoding: $src";
74 0         0 return "! Wrong Source encoding: $src";
75             }
76            
77 0 0       0 if ($tgt eq 'dos') { $tgt_cp=$dos;
  0 0       0  
    0          
    0          
78 0         0 } elsif ($tgt eq 'win') { $tgt_cp=$win;
79 0         0 } elsif ($tgt eq 'iso') { $tgt_cp=$iso;
80 0         0 } elsif ($tgt eq 'koi') { $tgt_cp=$koi;
81             } else {
82 0         0 croak "Wrong tgt encoding: $tgt";
83 0         0 return "! Wrong tgt encoding: $tgt";
84             }
85            
86 0         0 my %src_cp = reverse %{$src_cp};
  0         0  
87 0         0 my $out;
88             my @out;
89 0         0 foreach (@_) {
90 0         0 my @a=split //;
91 0         0 $out='';
92 0         0 foreach (@a) {
93 0         0 my $r=chr($tgt_cp->{$src_cp{ord($_)}});
94 0 0       0 $out.= $r?$r:$_;
95             }
96 0         0 push @out,$out;
97             }
98 0 0       0 if (wantarray) {
99 0         0 return @out;
100             } else {
101 0         0 return join ('',@out);
102             }
103             }
104            
105            
106             sub parse_lastname {
107 5     5 1 419 my $txt=lc shift;
108 5         19 my $wrap=shift;
109 5         12 my $last_letter=substr($txt,-2);
110            
111             #print $last_letter;
112 5 50       44 if ($last_letter eq 'ий') {
    50          
    50          
    50          
    50          
    50          
113 0         0 my $h={1=>'ий',
114             2=>'ого',
115             3=>'ому',
116             4=>'ого',
117             5=>'им',
118             6=>'ом'
119             };
120 0   0     0 return substr($txt,0,-2).($h->{$wrap}||return "!$txt");
121             } elsif ($last_letter eq 'ый') {
122 0         0 my $h={1=>'ый',
123             2=>'ого',
124             3=>'ому',
125             4=>'ого',
126             5=>'ым',
127             6=>'ом'
128             };
129 0   0     0 return substr($txt,0,-2).($h->{$wrap}||return "!$txt");
130             } elsif ($last_letter eq 'ой') {
131 0         0 return $txt;
132             } elsif ($last_letter eq 'ая') {
133 0         0 my $h={1=>'ая',
134             2=>'ую',
135             3=>'ой',
136             4=>'ую',
137             5=>'ой',
138             6=>'ой'
139             };
140 0   0     0 return substr($txt,0,-2).($h->{$wrap}||return "!$txt");
141             } elsif ($last_letter eq 'яя') {
142 0         0 my $h={1=>'яя',
143             2=>'юю',
144             3=>'ей',
145             4=>'юю',
146             5=>'ей',
147             6=>'ей'
148             };
149 0   0     0 return substr($txt,0,-2).($h->{$wrap}||return "!$txt");
150             } elsif ($last_letter eq 'ок') {
151            
152 0         0 my $h={1=>'ок', #это жена
153             2=>'ка', #отстался без жены
154             3=>'ке', #студенту жене
155             4=>'ку', #порвал жену
156             5=>'ком', #назвался женой
157             6=>'ке' #пишу о жене
158             };
159 0         0 return substr($txt,0,-2).$h->{$wrap};
160             }
161            
162 5         9 $_=substr($txt,-1);
163            
164 5 50       17 if ($_ eq 'й') {
165            
166 0         0 my $h={1=>'й',
167             2=>'я',
168             3=>'я',
169             4=>'ю',
170             5=>'ем',
171             6=>'и'
172             };
173 0   0     0 return substr($txt,0,-1).($h->{$wrap}||return "!$txt");
174             }
175 5 50       12 if ($_ eq 'а') {
176 0         0 my $h={1=>'а', #это жена
177             2=>'ой', #отстался без жены
178             3=>'у', #порвал жену
179             4=>'ой', #студенту жене
180             5=>'ой', #назвался женой
181             6=>'ой' #пишу о жене
182             };
183 0   0     0 return substr($txt,0,-1).($h->{$wrap}||return "!$txt");
184             }
185 5 50       12 if ($_ eq 'я') {
186 0         0 my $h={1=>'я', #это жена
187             2=>'и', #отстался без жены
188             3=>'ю', #порвал жену
189             4=>'е', #студенту жене
190             5=>'ей', #назвался женой
191             6=>'е' #пишу о жене
192             };
193 0   0     0 return substr($txt,0,-1).($h->{$wrap}||return "!$txt");
194             }
195 5 50       12 if ($_ eq 'ь') {
196 0         0 my $h={1=>'ь', #это жена
197             2=>'я', #отстался без жены
198             3=>'я', #порвал жену
199             4=>'ю', #студенту жене
200             5=>'ем', #назвался женой
201             6=>'е' #пишу о жене
202             };
203 0   0     0 return substr($txt,0,-1).($h->{$wrap}||return "!$txt");
204             }
205 5 50       13 if (/[уехъфыпролджэячсмитьбю]/) {
206 0         0 return $txt;
207             }
208 5 50       13 if (/в/) {
209 0         0 my $h={1=>'', #это жена
210             2=>'а', #отстался без жены
211             3=>'e', #студенту жене
212             4=>'у', #порвал жену
213             5=>'ым', #назвался женой
214             6=>'е' #пишу о жене
215             };
216 0         0 return $txt.$h->{$wrap};
217             }
218            
219 5 50       11 if (/[цукенгшщзхъфывапролджэячсмитьбю]/) {
220 0         0 my $h={1=>'', #это жена
221             2=>'а', #отстался без жены
222             3=>'у', #порвал жену
223             4=>'e', #студенту жене
224             5=>'ом', #назвался женой
225             6=>'ой' #пишу о жене
226             };
227 0         0 return $txt.$h->{$wrap};
228             }
229 5         1391 carp ("Unalbe to sklon: $txt");
230 5         29 return "$txt";
231            
232             }
233            
234             sub parse_n {
235 10     10 1 655 my $txt=lc shift;
236 10         27 my $wrap=shift;
237 10         16 my $last_letter=substr($txt,-2);
238            
239             #print $last_letter;
240 10 50       45 if ($last_letter eq 'ок') {
    50          
    50          
241 0         0 my $h={1=>'ок', #это жена
242             2=>'ка', #отстался без жены
243             3=>'ку', #порвал жену
244             4=>'ке', #студенту жене
245             5=>'ком', #назвался женой
246             6=>'ке' #пишу о жене
247             };
248 0         0 return substr($txt,0,-2).$h->{$wrap};
249             } elsif ($last_letter eq 'ел') {
250 0         0 my $h={1=>'ел', #это жена
251             2=>'ла', #отстался без жены
252             3=>'лу', #порвал жену
253             4=>'лу', #студенту жене
254             5=>'лом', #назвался женой
255             6=>'ле' #пишу о жене
256             };
257 0         0 return substr($txt,0,-2).$h->{$wrap};
258             } elsif ($last_letter eq 'ев') {
259 0         0 my $h={1=>'ев', #это жена
260             2=>'ьва', #отстался без жены
261             3=>'ьва', #порвал жену
262             4=>'ьву', #студенту жене
263             5=>'ьвом', #назвался женой
264             6=>'ьве' #пишу о жене
265             };
266 0         0 return substr($txt,0,-2).$h->{$wrap};
267             }
268            
269 10         15 $_=substr($txt,-1);
270            
271 10 50       22 if ($_ eq 'й') {
272 0         0 my $h={1=>'й',
273             2=>'я',
274             3=>'ю',
275             4=>'ю',
276             5=>'ем',
277             6=>'е'
278             };
279 0   0     0 return substr($txt,0,-1).($h->{$wrap}||return "!$txt");
280             }
281 10 50       19 if ($_ eq 'а') {
282 0         0 my $h={1=>'а', #это жена
283             2=>'ы', #отстался без жены
284             3=>'е', #студенту жене
285             4=>'у', #порвал жену
286             5=>'ой', #назвался женой
287             6=>'е' #пишу о жене
288             };
289 0   0     0 return substr($txt,0,-1).($h->{$wrap}||return "!$txt");
290             }
291 10 50       27 if ($_ eq 'я') {
292 0         0 my $h={1=>'я', #это жена
293             2=>'и', #отстался без жены
294             3=>'е', #студенту жене
295             4=>'ю', #порвал жену
296             5=>'ей', #назвался женой
297             6=>'е' #пишу о жене
298             };
299 0   0     0 return substr($txt,0,-1).($h->{$wrap}||return "!$txt");
300             }
301 10 50       19 if ($_ eq 'ь') {
302 0         0 my $h={1=>'ь', #это жена
303             2=>'я', #отстался без жены
304             3=>'ю', #студенту жене
305             4=>'я', #порвал жену
306             5=>'ем', #назвался женой
307             6=>'е' #пишу о жене
308             };
309 0   0     0 return substr($txt,0,-1).($h->{$wrap}||return "!$txt");
310             }
311 10 50       20 if (/[уеъыэю]/) {
312 0         0 return $txt;
313             }
314 10 50       20 if (/[вткнгзхфвпрлдмтб]/) {
315 0         0 my $h={1=>'', #это жена
316             2=>'а', #отстался без жены
317             3=>'е', #студенту жене
318             4=>'у', #порвал жену
319             5=>'ом', #назвался женой
320             6=>'е' #пишу о жене
321             };
322 0         0 return $txt.$h->{$wrap};
323             }
324            
325 10 50       19 if (/[шщхжч]/) {
326 0         0 my $h={1=>'', #это жена
327             2=>'а', #отстался без жены
328             3=>'У', #студенту жене
329             4=>'у', #порвал жену
330             5=>'ем', #назвался женой
331             6=>'е' #пишу о жене
332             };
333 0         0 return $txt.$h->{$wrap};
334             }
335 10         2517 carp ("Unalbe to sklon: $txt");
336 10         53 return "$txt";
337            
338             }
339            
340             sub sklon {
341 5     5 1 20 $_=shift;
342 5         987 print "$_\n";
343 5         23 /(\w+)\s(\w+)\s(.+)/;
344 5         19 my $pad=shift;
345 5         15 my $decl=$pads{$pad};
346            
347 5 50       16 croak "Unknown pad attempting to be set : $pad" unless $decl;
348 5         18 return initcap(parse_lastname($1,$decl)." ".parse_n($2,$decl)." ".parse_n($3,$decl));
349            
350             }
351             sub initcap {
352 5     5 1 8 $_=shift;
353 5         6 my $out;
354 5         23 while (/(\w)(\w*)(\W*)/g) {
355 0         0 $out.=uc ($1).$2.$3;
356             }
357 5         327 return $out;
358             }
359            
360             1;
361            
362             __END__