On Mar 25, Peter Rabbitson said:

package CalcTest;

use warnings;
use strict;

my @collect;

This is suspect. You shouldn't be using this array. You should be storing data in your object.


1;

It's probably safer to put this at the very end of your module, just in case you have other code (non-subroutine code) that could possibly return false.


sub new {

   my $class = shift;

   my $self = {};

   @collect = (0,0,0);

   bless $self, $class;

   return $self;
}

How about:

  sub new {
    my $class = shift;
    my $self = [ 0, 0, 0 ];
    bless $self, $class;
    return $self;
  }

Now instead of using an outside array, each object will have its OWN three numbers.

sub add {

print (shift @_);

The first argument to ANY method is the class or object that invoked the method. $_[0] is the object in this case.


   if ( (scalar @_) != 3) {
       return undef;
   }

   my ($var0, $var1, $var2) = @_;

   $collect[0] += $var0;
   $collect[1] += $var1;
   $collect[2] += $var2;

   return 1;
}

How about:

  sub add {
    my $self = shift;
    return unless @_ == 3;
    $self->[0] += shift;
    $self->[1] += shift;
    $self->[2] += shift;
    return 1;
  }

That uses the object $self, which is an array reference, and adds one argument to each element of @$self in turn.

sub result {

   return @collect;
}

Here, it'd be:

  sub result {
    my $self = shift;
    return @$self;
  }

#### main perl program (test.pl)

use warnings;
use strict;

use CalcTest;

my $calc = CalcTest->new();

print "error\n\n" unless $calc->add (3, 4, 5);

print "error\n\n" unless $calc->add (1, 2, 3);

print join (' * ',$calc->result);
print "\n\n";

exit 0;

The interface to the module hasn't changed at all, so the code above should still work.


1. Everytime I call one of the subroutines (methods I believe they are
called?) I get a hash in $_[0] with only one value - the string name of the
package I am calling. What defines the contents of this hash? Is it always
just this single value pair or there might be additional values? If yes -
what kind? (A reference towards *clear* documentation would be best).

You were misunderstanding the output of printing the object. It printed something like


  CalcTest=HASH(0x....)

That's what an object looks like when you print it.  Class=TYPE(ADDR).

You typically STORE information in the object. Your code was ignoring it entirely. There was no need for your code to be "object-oriented" at all.

2. The idea of blessing... I understand the idea, I don't understand the
reason. Why does bless need an empty hash intialized for it to bless it?
Isn't blessing completely symbolic? Or I actually might put something in
\%self ? If I do - what does this give me?

Blessing a reference tells Perl that the reference is now an object of a specific class, and can invoke methods of that class with the $obj->method syntax.


3. The usage of my in a package - here and there I see clues that 'my' does
behave differently when used in a module - is this true? Is it correct do
declare a package-wide @collect and have subroutines work on this
semi-global variable (global from the package point of view), so I can get
results that stack-up - the addition in the above example, or the
accumulation like in Text::CSV where you keep pushing data in, and then you
wrap a string...  you probably see where I am going.

You were using @collect poorly. With your code, you couldn't have TWO instances of a CalcTest. Any work the first instance did would be erased when the second instance is created, and after that, both instances would always return the same results.


4. If I don't define an explicit return value for a sub - is it always undef
(like I would expect) or the package occasionally might decide to assign
something as a return value?

If there is no explicit return value for a function, it returns the LAST thing it evaluated.


As far as documentation goes, please read

  perldoc perlboot

--
Jeff "japhy" Pinyan         %  How can we ever be the sold short or
RPI Acacia Brother #734     %  the cheated, we who for every service
http://japhy.perlmonk.org/  %  have long ago been overpaid?
http://www.perlmonks.org/   %    -- Meister Eckhart

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>




Reply via email to