File Coverage

blib/lib/Lingua/ES/Silabas.pm
Criterion Covered Total %
statement 17 17 100.0
branch 5 6 83.3
condition n/a
subroutine 3 3 100.0
pod 0 1 0.0
total 25 27 92.5


line stmt bran cond sub pod time code
1             package Lingua::ES::Silabas;
2              
3 1     1   9585 use strict;
  1         4  
  1         70  
4 1     1   9 use warnings;
  1         3  
  1         1747  
5              
6             require Exporter;
7              
8             our @ISA = qw(Exporter);
9              
10             our @EXPORT = qw(silabas);
11              
12             our $VERSION = '0.01';
13              
14             ######################################################################
15              
16             # grupos consonánticos
17             my @GC = qw(
18             bl br
19             ch cl cr
20             dl dr
21             fl fr
22             gl gr
23             ll
24             pl pr
25             rr
26             tl tr
27             );
28              
29             my $VA = 'áéíóúÁÉÍÓÚ'; # vocales acentuadas
30             my $VD = '[iuüÜ]'; # vocales débiles
31             my $VF = "[aeo$VA]"; # vocales fuertes
32             my $V = "(?:$VD|$VF)"; # vocales
33             my $C = '[b-df-hj-np-tv-zñÑ]'; # consonantes
34             my $CoGC = '(?:'. join('|', @GC) ."|$C)"; # consonantes y grupos consonánticos
35              
36             my $dipt = "(?:${VD}h?$VF|${VF}h?$VD|$V$V)"; # diptongos
37             my $tript = "(?:$V$V$V)"; # triptongos
38              
39             sub silabas ($) {
40 8     8 0 102 my $palabra = shift;
41 8         8 my @silabas;
42              
43 8         16 while ($palabra) {
44              
45 20 100       528 if ($palabra =~ /^($C*?(?:$tript|$dipt|$V)$C{0,2}?)$CoGC$V/io) {
46 12         21 push @silabas, $1;
47 12         54 substr $palabra, 0, $+[1], '';
48             } else {
49 8         12 push @silabas, $palabra;
50 8         15 undef $palabra;
51             }
52              
53             }
54              
55             # hiatos
56 20 50       169 @silabas = map {
    100          
57 8         11 !/(.*?$VF$VD?)(?(?=$VF$VF)($VF))($VF.*)/sio ? $_ :
58             $2 ? ($1,$2,$3) :
59             ($1,$3)
60             } @silabas;
61              
62 8         44 return @silabas;
63             }
64              
65             1;
66              
67             __END__