Anthony Ettinger am Samstag, 27. Mai 2006 22.02: > sub foo > { > my $self = shift; #object > > if (@_ == 0) #any other arguments? > { > return $self->{'foo'}; #getter (no other arguments) > } > > return $self->{'foo'} = shift; # setter (save next argument) > > }
Hi together This version could be written shorter (keeping the "shift $self" and premature return): sub foo { my $self=shift; return $self->{foo} unless @_; # note the missing quotes (not necessary) # and the equality of [EMAIL PROTECTED] and @_==0 $self->{foo}=$_[0]; # note the missing return; returns the # last evaluated expression, which is the # assigned value # or: $self->{foo}=shift; } The above versions, as version 1 and version 2 below return the new attribute value, if it's set. Also in use are mutators that return the _old_ one. Chen Li, also have a look at the (source code of) Class::Accessor and Class::Accessor::Fast modules; they can be used for the simple cases that an attribute is only got/set without doing anything additional work. They create accessors/mutators automatically (avoiding repetitive code if there are a lot of a/m) - at the cost of a little loss of performance. > On 5/27/06, Peter Cornelius <[EMAIL PROTECTED]> wrote: > > This might be a little more clear if you break down the way arguments > > are being passed in and what they actually are. It sounds like > > you're aware that the arguments are passed in as a list name @_, it > > looks like the arguments are something like this: > > > > @_ = ( #<---- A list > > { _name => 'something' }, # <---- a hash reference (objects are > > hashes in perl) > > 'some set name string' #<---- a string > > ); > > > > The first version extracts the arguments so that you can refer to > > them by names that might have some meaning to someone maintaining > > your code latter on. The second version accesses them directly. > > > > > sub name{ #version 1 > > > my $self=shift; > > > > shift is going to give you $_[0] > > > > > my $set_name=shift; > > > > This sets $set_name to $_[1] > > > > > $self->{_name}=$set_name if defined $set_name; > > > > So this is equivalent to > > $_[0]->{_name} = $_[1] if defined $_[1] > > the '->' is to dereference the hash reference stored in $_[0]. which is created in the new() class method in the line my [EMAIL PROTECTED]; ( my [EMAIL PROTECTED]; # create (and assign) hash reference my [EMAIL PROTECTED]; # create (and assign) array reference ) > > > return $self->{_name} > > > } > > > > > > > > > Another version for the subroutine name > > > > > > sub name{ #verstion 2 > > > $_[0]->{_name}=$_[1] if defined }$_[1]; v ^ > > > {$_[0]->{_name} > > > } There's a {} pair too much, leading to a syntax error sub name { $_[0]->{_name}=$_[1] if defined $_[1]; $_[0]->{_name}; } > > > I feel a little bit confuse about the verion 2 > > > subroutine name. The way it gets the value of > > > attribute name looks like this to me: > > > array element->{_name} It not only gets it from the hashref object, it also returns this value since this (the dereferencing of the attribute value) is the last expression in the object method. (Compare the 1; at the end of perl modules: A module must return a true value to indicate that is has been loaded successfully. It's good practice, although only neccessary if the evaluated expression before this "1;" would give a false value) > > > (I know that the $_[0] in the default array @_ is > > > actually an object $self. ) Dani -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] <http://learn.perl.org/> <http://learn.perl.org/first-response>