Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much

Re: Modify the Object

by Athanasius (Chancellor)
on Oct 02, 2012 at 13:02 UTC ( #996856=note: print w/replies, xml ) Need Help??

in reply to Modify the Object

Can some one tell how to change the values of object?

The usual way is to provide an accessor method in the First package:

sub access_A { my ($self, $new_a) = @_; $self->{A} = $new_a if defined $new_a; return $self->{A}; }

Then you can call this method in the main program as follows:

my $obj = new First('A' => 'red', 'B' => 'green'); print "Here, A's colour is ", $obj->access_A(), "\n"; $obj->access_A('yellow'); $obj->teller();

which will output:

Here, A's colour is red $VAR1 = bless( { 'A' => 'yellow', 'B' => 'green' }, 'First' );

By the way, in the definition of sub teller there should not be any parentheses after the method name. The parentheses create a prototype, saying that the sub takes no arguments — which is unnecessary, and, in this case, incorrect.

Hope that helps,

Update: Added defined to the test in sub access_A, to solve the problem identified by tobyink, below.

Athanasius <°(((><contra mundum

Replies are listed 'Best First'.
Re^2: Modify the Object
by tobyink (Abbot) on Oct 02, 2012 at 16:02 UTC

    Your example accessor has a problem:

    package Local::Class; sub new { my $class = shift; bless +{ A=>'default' }; } sub access_A { my ($self, $new_a) = @_; $self->{A} = $new_a if $new_a; return $self->{A}; } package main; use 5.010; my $obj = Local::Class->new; $obj->access_A(1); say $obj->access_A; # says 1 $obj->access_A(2); say $obj->access_A; # says 2 $obj->access_A(0); say $obj->access_A; # says 2 !!!

    A better way of writing that accessor would have been:

    sub access_A { my $self = shift; $self->{A} = shift if @_; return $self->{A}; }

    (Or even better, use Moose so that you don't need to worry about writing accessors.)

    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'
Re^2: Modify the Object
by Your Mother (Chancellor) on Oct 02, 2012 at 17:06 UTC

    Your amendment is fine but I prefer the idiom tobyink showed. It's terse and lends itself to simple flow validation–

    # use Carp; sub access_A { my $self = shift; $self->{A} = shift if @_; croak "Too many arguments to access_A" if @_; $self->{A}; }

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://996856]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (4)
As of 2018-01-18 20:58 GMT
Find Nodes?
    Voting Booth?
    How did you see in the new year?

    Results (214 votes). Check out past polls.