package Lingua::PT::Inflect; use 5.006; use strict; use warnings; use Lingua::PT::Hyphenate; require Exporter; our @ISA = qw(Exporter); our %EXPORT_TAGS = ( 'all' => [ qw( sing2plural ) ] ); our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); our @EXPORT = qw( sing2plural ); our $VERSION = '0.06'; =head1 NAME Lingua::PT::Inflect - Converts Portuguese words from singular to plural =head1 SYNOPSIS use Lingua::PT::Inflect; $plural = sing2plural('programador') # now holds 'programadores' =head1 DESCRIPTION Converts Portuguese words from singular to plural. There may be some special cases that will fail (words ending in -ão or -s might fail, as many special cases are yet to be prevented; anyone volunteering to look at a huge list of words?) =cut my (%exceptions,@rules,%rules); BEGIN { %exceptions = ( 'lápis' => 'lápis', 'pires' => 'pires', 'mão' => 'mãos', 'afegão' => 'afegãos', 'pão' => 'pães', 'capitão' => 'capitães', 'cão' => 'cães', 'alemão' => 'alemães', ); @rules = map qr/$_/, qw(ás ês el ol al oi ul m ão (?<=[aeiou]) (?<=[rnsz])); %rules = ( qr/ás/ => 'ases', qr/ês/ => 'eses', qr/el/ => 'éis', qr/ol/ => 'óis', qr/al/ => 'ais', qr/oi/ => 'ois', qr/ul/ => 'uis', qr/m/ => 'ns', qr/ão/ => 'ões', qr/(?<=[aeiou])/ => 's', qr/(?<=[rnsz])/ => 'es', ); } # =head1 METHODS =head2 new Creates a new Lingua::PT::Inflect object. If you're doing this lots of time, it would probably be better for you to use the sing2plural function directly (that is, creating a new object for each word in a long text doesn't seem so bright if you're not going to use it later on). =cut sub new { my ($self, $word) = @_; bless \$word, $self; } =head2 sing2plural Converts a word in the singular gender to plural. $plural = sing2plural($singular); =cut sub sing2plural { defined $_[0] || return undef; my $word; if (ref($_[0]) eq 'Lingua::PT::Inflect') { my $self = shift; $word = $$self; } else { $word = shift; } $_ = $word; defined $exceptions{$_} && return $exceptions{$_}; for my $rule (@rules) { if (s/$rule$/$rules{$rule}/) {return $_} } if (/il$/) { my @syl = hyphenate($_); s!il$!$syl[-2] =~ /[ãâáêéíóõôúÃÁÉÍÓÕÔÊÂÚ]/ ? 'eis' : 'is' !e; } return $_; } 1; __END__ =head1 TO DO =over 6 =item * Several words are exceptions to the rules; there is a file of those words that need to be checked. =back =head1 SEE ALSO More tools for the Portuguese language processing can be found at the Natura project: http://natura.di.uminho.pt =head1 AUTHOR Jose Castro, C<< >> =head1 COPYRIGHT & LICENSE Copyright 2004 Jose Castro, All Rights Reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut