Perl is a dynamic language that supports prototype-based OOP based on hashes and packages. To create an object, bless is typically used:
package Animal; sub new { my ($class, %args) = @_; return bless { %args }, $class; } sub speak { print "An animal makes a sound "; } package Dog; use parent 'Animal'; # or our @ISA = ('Animal') sub speak { print "Woof! "; } my $dog = Dog->new(name => 'Rex'); $dog->speak; # Outputs: Woof!
Here, the constructor new creates a hash with the object’s data and associates it with the class. Methods are declared like regular subroutines. Inheritance is possible through @ISA or the parent/base module. OOP in Perl is flexible, but not strict, which opens up both additional possibilities and nuances.
How is it best to implement private properties/methods of an object in Perl, considering the absence of private/protected syntax?
Answer: There is no built-in mechanism, however, privacy is achieved through lexical variables outside the package or naming conventions (_private). For example:
package Car; my $secret = 'hidden'; # private to the package sub _private { ... } # convention: do not call from outside
This approach does not protect against access but is considered standard.
Story
In a project, an object was defined that contained an array of references to other objects. Developers forgot to call methods like $obj->method, calling them as method($obj), which led to unexpected results, especially with inheritance and method overriding – the class was incorrectly determined, and parent methods were called instead of child ones.
Story
Using a package variable instead of a lexical variable to store the state of an object led to one change in state being reflected across all instances of the class, as the data was shared rather than individual to the object.
Story
Implicit manipulation of the @ISA variable for inheritance, during dynamic loading of classes, in large projects led to parent lists not being updated in time, causing the program to unexpectedly lose methods or obtain an incorrect hierarchy.