in reply to Re: trouble with evaluate
in thread trouble with evaluate

Thank you for your help, Eliya . Your comment about class variables vs. instance variables made me realize I was confusing the two. My goal is to create an object that does some work (parses a file) and then persists while other things are happening, and can be queried to get values of any of 50-100 different values that it holds in instance variables. Does that mean that all of those variables should be in the constructor? I tried both versions of the code you suggested, but they both return "undefined" for $var1, so either the eval {} syntax is not quite right, or $var1 isn't getting set correctly. I'm still trying to figure it out.

Replies are listed 'Best First'.
Re^3: trouble with evaluate
by Eliya (Vicar) on Apr 09, 2011 at 03:04 UTC
    can be queried to get values of any of 50-100 different values that it holds

    I think what you want is actually rather simple.  The classic way to store instance data is in the hash that makes up the object ($self here). In other words, as the "variable names" are just keys in the hash (i.e. strings), there's no need for eval or anything like this.  Your envisaged generic accessor (get_var) could just do a simple hash lookup:

    ackage parser; sub new { my $self = bless {}, $_[0]; $self->parse(); return $self; } sub parse{ my $self = shift; $self->{var1} = 'foo'; $self->{var2} = 'bar'; #... } sub get_var{ my ($self, $var_name) = @_; return $self->{$var_name}; } package main; my $p = parser->new(); print $p->get_var('var1'); # -> foo print $p->get_var('var2'); # -> bar

    (note that ->parse() doesn't necessarily have to be called from the constructor)

Re^3: trouble with evaluate
by JavaFan (Canon) on Apr 09, 2011 at 00:54 UTC
    Does that mean that all of those variables should be in the constructor?
    No.