File Coverage

NameParse.pm
Criterion Covered Total %
statement 12 62 19.3
branch 0 20 0.0
condition n/a
subroutine 4 7 57.1
pod 2 3 66.6
total 18 92 19.5


line stmt bran cond sub pod time code
1             package Lingua::RU::NameParse;
2              
3 1     1   7654 use 5.008;
  1         3  
  1         40  
4 1     1   6 use strict;
  1         2  
  1         36  
5 1     1   5 use warnings;
  1         6  
  1         106  
6              
7              
8             our $VERSION = '0.02';
9              
10              
11 0     0 0   sub new { my $class = shift;
12 0           bless {}, $class; }
13              
14              
15              
16              
17             =item normalize NAME
18              
19             Given a first name and a patronymic, returns the name and patronymic in the nominative
20             case.
21              
22             =cut
23              
24              
25             sub normalize {
26            
27            
28            
29 0     0 1   my ( $self, $testme ) = @_;
30            
31 1     1   1605 use utf8;
  1         13  
  1         7  
32              
33             # voodo to set the string's UTF8 flag
34 0           $testme = pack 'U*', unpack( 'U*', $testme );
35            
36 0           my ( $w1, $w2 ) = split m/\s+/, $testme;
37            
38            
39             ##################
40             # ACCUSATIVE
41             ##################
42 0 0         if ( $w2 =~ /[чк]а$/ ) {
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
43 0           $w2 =~ s/а$//g;
44 0           $w1 =~ s/а$//g;
45 0           $w1 =~ s/я$/й/g;
46             }
47            
48             elsif ( $w2 =~ /овну\b/ ) {
49 0           $w2 =~ s/у\b/а/;
50 0           $w1 =~ s/ью\b/ья/;
51 0           $w1 =~ s/ию\b/ия/;
52             }
53            
54             ################
55             # DATIVE
56             ################
57             elsif ( $w2 =~ /не\b/ ) {
58 0           $w2 =~ s/е\b/а/;
59 0           $w1 =~ s/ье\b/ья/;
60 0           $w1 =~ s/е\b/а/;
61 0           $w1 =~ s/ии\b/ия/;
62             }
63            
64             elsif ( $w2 =~ /че\b/ ) {
65 0           $w2 =~ s/е$//;
66 0           $w1 =~ s/ее\b/ей/; # aleksei
67             }
68            
69             # Константину Левину
70             elsif ( $w2 =~ /[нч]у$/ ) {
71 0           $w2 =~ s/у$//;
72 0           $w1 =~ s/у\b//;
73 0           $w1 =~ s/([еи])ю\b/$1й/;
74             }
75            
76              
77             ###################
78             # INSTRUMENTAL
79             ###################
80             # Верой Павловною
81             elsif ( $w2 =~ /но[юй]$/ ) {
82              
83 0           $w2 =~ s/ою$/а/;
84 0           $w2 =~ s/ой$/а/;
85 0           $w1 =~ s/ой$/а/;
86 0           $w1 =~ s/ею/я/;
87 0           $w1 =~ s/ей/я/;
88             }
89            
90              
91             elsif ( $w2 =~ /ем$/ ) {
92 0           $w2 =~ s/ем\b//;
93 0           $w1 =~ s/ом\b//;
94 0           $w1 =~ s/еем\b/ей/;
95             }
96            
97             elsif ( $w2 =~ /ым\b/ ) {
98 0           $w2 =~ s/ым/ый/;
99             }
100              
101             ###################
102             # GENITIVE
103             ###################
104             elsif ( $w2 =~ /ны$/ ) {
105 0           $w2 =~ s/ы$/а/g;
106 0           $w1 =~ s/ы$/а/g;
107 0           $w1 =~ s/ьи$/ья/;
108             }
109            
110             elsif ( $w2 =~ /ого$/ ) {
111 0           $w2 =~ s/ого\b/ий/g;
112 0           $w1 =~ s/а$//g;
113             }
114            
115 0           $w1 =~ s/вл\b/вел/; # pavel
116            
117 0           return "$w1 $w2";
118             }
119              
120             =item transliterate STRING
121              
122             Transliterates the string from Cyrillic to Latin.
123              
124             =cut
125              
126              
127             sub transliterate {
128 0     0 1   my ( $self, $in ) = @_;
129            
130            
131 0           for ( $in ) {
132 0           s/ц/ts/gi;
133 0           s/ш/sh/gi;
134 0           s/щ/shch/gi;
135 0           s/ж/zh/gi;
136 0           s/я/ya/gi;
137 0           s/я\b/ya/gi;
138 0           s/ч/ch/g;
139 0           s/ч\b/ch/g;
140 0           s/ю/yu/gi;
141            
142 0           tr/йукнгзхфывапролдэсмитеьбБЙУКЕНГЗХФЫВАПРОЛДЭСМИТ/jukngzhfyvaproldesmite'bBJUKENGZHFYVAPROLDESMIT/;
143             }
144            
145            
146 0           return $in;
147              
148             }
149              
150             1;
151             __END__