Lingua::ES::Silabas - Divide una palabra en sE<iacute>labas


Lingua-ES-Silabas documentation Contained in the Lingua-ES-Silabas distribution.

Index


Code Index:

NOMBRE

Top

Lingua::ES::Silabas - Divide una palabra en sílabas

SINOPSIS

Top

  use Lingua::ES::Silabas;

  $palabra = 'externocleidomastoideo'; # muchas silabas ;-)

  ## en contexto de lista,
  ## lista de silabas que componen la palabra
  @silabas = silabas($palabra);

  ## en contexto escalar,
  ## el numero de silabas que componen la palabra
  $num_silabas = silabas($palabra);

DESCRIPCION

Top

Lingua::ES::Silabas::silabas() recibe como argumento una palabra y regresa una lista con las sílabas que la forman.

BUGS

Top

Probablemente existan errores en el código, o en las reglas que se utilizan para separar las palabras en sílabas, por lo que las correcciones serán bienvenidas.

AUTOR

Top

Marco Antonio Valenzuela Escárcega, <marcos@cpan.org>

COPYRIGHT

Top


Lingua-ES-Silabas documentation Contained in the Lingua-ES-Silabas distribution.

package Lingua::ES::Silabas;

use strict;
use warnings;

require Exporter;

our @ISA = qw(Exporter);

our @EXPORT = qw(silabas);

our $VERSION = '0.01';

######################################################################

# grupos consonánticos 
my @GC = qw(
               bl br
            ch cl cr
	       dl dr
	       fl fr
	       gl gr
	       ll
	       pl pr
		  rr
	       tl tr
	   );

my $VA  = 'áéíóúÁÉÍÓÚ';   # vocales acentuadas
my $VD  = '[iuüÜ]';   # vocales débiles 
my $VF  = "[aeo$VA]";  # vocales fuertes
my $V   = "(?:$VD|$VF)";  # vocales
my $C   = '[b-df-hj-np-tv-zñÑ]';  # consonantes
my $CoGC = '(?:'. join('|', @GC) ."|$C)";  # consonantes y grupos consonánticos

my $dipt = "(?:${VD}h?$VF|${VF}h?$VD|$V$V)";  # diptongos
my $tript = "(?:$V$V$V)";  # triptongos

sub silabas ($) {
    my $palabra = shift;
    my @silabas;

    while ($palabra) {

        if ($palabra =~ /^($C*?(?:$tript|$dipt|$V)$C{0,2}?)$CoGC$V/io) {
            push @silabas, $1;
            substr $palabra, 0, $+[1], '';
        } else {
            push @silabas, $palabra;
            undef $palabra;
        }

    }

    # hiatos
    @silabas = map {
                   !/(.*?$VF$VD?)(?(?=$VF$VF)($VF))($VF.*)/sio ? $_         :
		                                            $2 ? ($1,$2,$3) :
							         ($1,$3)
		   } @silabas;

    return @silabas;
}

1;

__END__