Skip to main content

  | मौसम…

411 समाचार
Public archive edition · Attributed source reporting with original dates · AI drafts are excluded

411 REFERENCE · Wikibooks

Perl Programming/Objects

Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.

Perl Code reuse (modules) Structure and style Objects When Perl was initially developed, there was no support at all for object-orientated (OO) programming. Since Perl 5, OO has been added using the concept of Perl packages (namespaces), an operator called bless, some magic variables (@ISA, AUTOLOAD, UNIVERSAL), the -> and some strong conventions for supporting inheritance and encapsulation. An object is created using the package keyword. All subroutines declared in that package become object or class methods. A class instance is created by calling a constructor method that must be provided by the class, by convention this method is called new() Let's see this constructor. package Object; sub new { return bless {}, shift; } sub setA { my $self = shift; my $a = shift; $self->{a}=$a; } sub getA { my $self = shift; return $self->{a}; } Client code can use this class something like this. my $o = Object->new; $o->setA(10); print $o->getA; This code prints 10. Let's look at the new contructor in a little more detail: The first thing is that when a subroutine is called using the -> notation a new argument is pre-pended to the argument list. It is a string with either the name of the package or a reference to the object (Object->new() or $o->setA. Until that makes sense you will find OO in Perl very confusing. To use private variables in objects and have variables names check, you can use a little different approach to create objects. package my_class; use strict; use warnings; { # All code is enclosed in block context my %bar; # All vars are declared as hashes sub new { my $class = shift; my $this = \do{ my $scalar }; # object is a reference to scalar (inside out object) bless $this, $class; return $this; } sub set_bar { my $this = shift; $bar{$this} = shift; } sub get_bar { my $this = shift; return $bar{$this}; } } Now you have good encapsulation - you cannot access object variables directly via $o->{bar}, but only using set/get methods. It's also impossible to make mistakes in object variable names, because they are not a hash-keys but normal perl variables, needed to be declared. We use them the same way like hash-blessed objects: my $o = my_class->new(); $o->set_bar(10); print $o->get_bar(); prints 10 Further reading perlobj - Perl object reference, perldoc.perl.org Perl OOP, perltutorial.org Perl Code reuse (modules) Structure and style