Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re: Modify the Object

by Athanasius (Monsignor)
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


Comment on Re: Modify the Object
Select or Download Code
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 (Canon) 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?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://996856]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (15)
As of 2014-09-18 16:12 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (118 votes), past polls