Just a quick note; dont use $a and $b as named variables.. they're 'special' (used by the cmp operator) so to avoid ambiguity, use something else/more descriptive... or use $c if it makes you happy =) hth Jos Boumans ----- Original Message ----- From: "Me" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]> Sent: Saturday, June 23, 2001 7:11 PM Subject: Re: Failed in package programme, how do I use package and object? > > I'm try my best > > And you had 99% of it right. > > > package pt; > > use 5.0000; > > $a="ok"; #for public using > > $b="It's"; > > > > # I don't know why put the newsubroutine in this package, > > # perhaps, it is a constructer, I copy from PERL's manual, > > # but it seem don't do anything. > > Most of what you wrote is redundant in this > particular case. You could have written: > > package foo; > sub bar { bless \$qux }; > . > . > package waldo; > $emerson = foo->new; > > As you can see, $emerson is just a reference to $qux. > And $qux is undefined, but has one special property: > it's been blessed, which is how you turn a reference > into an object (which is just a reference that knows > what package it belongs to). Simple, really. > > As you start to do more complex things, your constructor > needs to get a bit more clever. > > In particular, what if the following call appears: > > oof->new; > > and oof ISA (inherits from) foo, and has no constructor > defined, hence inheriting its constructor from foo? > > Well, bless with one argument (as used in my snippet > above) associates that argument with the current > package, in the above case, foo, thus constructing a > foo object not an oof object. So one needs to find out > what package name was used to call the constructor > (the package name is conveniently passed as the > first argument whenever a sub is called using the > object oriented syntax) and then use the two argument > form of bless: > > > sub new > > my $type = shift; > > my $self = {}; > > bless $self,$type; > > } > > The $self = {} bit is so that the object can carry around > data as well as being blessed (which, applied to a mere > scalar, means you can only access subs (methods)). > > > package main; # My application > > use pt > > $c=pt->new(); > > print $c->displaysub().$a; > > The $a is assumed to be in the main package. > > Use either: > > print $c->displaysub().$ct::a; > > or use our: > > package pt; > our $a; > package main; > print $c->displaysub().$ct::a; > > or create displaya, an equivalent of displaysub, > only for $a, and call it as a class sub: > > package pt; > our $a; > package main; > print $c->displaysub().ct->displaya; > > hth > >