develooper Front page | perl.beginners | Postings from December 2002

Re: help with classes...

Thread Previous | Thread Next
Sheriff Gaye
December 10, 2002 07:13
Re: help with classes...
Message ID:
Forwarded Message From:"christopher j bottaro" <>Reply-to:cjb@cs.utexas.eduTo:beginners@perl.orgSubject:help with classes...Date:Tue, 10 Dec 2002 04:45:15 -0600MIME-Version:1.0Content-Type:text/plain; charset="us-ascii"Content-Transfer-Encoding:7bitMessage-Id:<>

Plain Text Attachment [ Save to my Yahoo! Briefcase  |  Download File ] 
hey,i'm a c/c++ programmer struggling to pick up OO perl.  i've been reading the perltoot and i have question about the following:package Person;    use strict;    sub new {        my $self  = {};        $self->{NAME}   = undef;        $self->{AGE}    = undef;        $self->{PEERS}  = [];        bless($self);           # but see below        return $self;    }    sub name {        my $self = shift;        if (@_) { $self->{NAME} = shift }        return $self->{NAME};    }ok, in the sub new(), i understand that $self is a ref and new() is returning it.  what does bless do (the single arg version).  i thought bless takes 2 args:  what to bless and the name to bless it with...?  what else does bless do besides give something a type?in the sub name(), what is the first argument?  obviously its a reference to a person object (or whatever new() returned).  but why?  i've written subs before and used shift(), but this is confusing me.  say i have $person = Person->new();  now i do $person->name();  i'm not passing it any arguments so why is the sub name() receiving an argument which is a reference to a Person object?  does it have something to do with bless()?  something to do with being a part of package?thanks for the help....=)christopher


Hi  Chris,

I felt the same way when I first started out with classes, but keep at it,

 it's not as hard as it looks :)

The single argument form of bless blesses the reference

 into the current package. So if you have :

 package Person;

my $ref=\%hash;


$ref will be blessed into the Person package.

Once you have blessed a reference into a package, whenever you call a 

method(sub) via that reference, the first argument perl passes

to that method is the reference. This happens behind the scenes

so when you call $ref->subname() and $ref is in the Person 

package, perl substitutes that statement for 


so $ref->destroy('Ring'); when $ref is in the Lotr package

ends up as Lotr::destroy($ref,'Ring');

So in order to get to the other args, you do

 a shift to remove the ref from the @_ array.

Hope that's been of help.


Image by

Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now
Thread Previous | Thread Next Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at | Group listing | About