Perl es un lenguaje dinámico que admite POO basada en prototipos utilizando hashes y paquetes. Para crear un objeto, se utiliza comúnmente bless:
package Animal; sub new { my ($class, %args) = @_; return bless { %args }, $class; } sub speak { print "Un animal hace un sonido "; } package Dog; use parent 'Animal'; # o our @ISA = ('Animal') sub speak { print "¡Guau! "; } my $dog = Dog->new(name => 'Rex'); $dog->speak; # Imprimirá: ¡Guau!
Aquí, el constructor new crea un hash con los datos del objeto y lo vincula a la clase. Los métodos se declaran como subprogramas ordinarios. La herencia es posible a través de @ISA o el módulo parent/base. La POO en Perl es flexible, pero no estricta, lo que abre tanto más posibilidades como sutilezas.
¿Cómo implementar mejor propiedades/métodos privados de un objeto en Perl, considerando la ausencia de la sintaxis private/protected?
Respuesta: No hay un mecanismo incorporado, sin embargo, la privacidad se logra a través de variables léxicas fuera del paquete o convenciones de nombramiento (_private). Por ejemplo:
package Car; my $secret = 'oculto'; # privado para el paquete sub _private { ... } # convención: no llamar desde fuera
Este enfoque no protege contra el acceso, pero se considera estándar.
Historia
En un proyecto se definió un objeto que contenía un array de referencias a otros objetos. Los desarrolladores olvidaban llamar a los métodos como $obj->method, llamándolos como method($obj), lo que llevaba a resultados inesperados, especialmente en la herencia y sobrecarga de métodos: se determinaba incorrectamente la clase y se llamaban métodos de los padres en lugar de los hijos.
Historia
El uso de una variable de paquete en lugar de una variable léxica para almacenar el estado de un objeto resultaba en que un cambio de estado se reflejaba en todas las instancias de la clase, ya que los datos eran compartidos y no individuales para el objeto.
Historia
El trabajo implícito con la variable @ISA para la herencia, al cargar dinámicamente clases, en grandes proyectos hacía que las listas de padres no se actualizaran a tiempo, y el programa perdía métodos inesperadamente o obtenía una jerarquía incorrecta.