in reply to trouble with evaluate

Not sure I understand what you're trying to do.  Do you want to retrieve the value of my $var1 or the value of $self->{$var1} (i.e. where the attribute name is in the value of the class variable $var1) ?

The first could be achieved like this

sub get_var{ my ($self, $var_name) = @_; return eval "\$$var_name"; }

the second like so

sub get_var{ my ($self, $var_name) = @_; return $self->{eval "\$$var_name"}; }

(As both are methods, you'd need to call them as $val = $obj->get_var('var1').)

Update: here's a full example, so you know how I interpreted your intentions... :)

#!/usr/bin/perl -wl use strict; package parser; my $var1 = "foo"; sub new { my $self = bless {}, $_[0]; $self->parse(); return $self; } sub parse{ my $self = shift; $self->{$var1} = 'bar'; } sub get_class_var{ my ($self, $var_name) = @_; return eval "\$$var_name"; } sub get_inst_var{ my ($self, $var_name) = @_; return $self->{eval "\$$var_name"}; } package main; my $p = parser->new(); print $p->get_class_var('var1'); # -> foo print $p->get_inst_var( 'var1'); # -> bar

Replies are listed 'Best First'.
Re^2: trouble with evaluate
by genghis (Novice) on Apr 09, 2011 at 00:11 UTC

    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.

      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)

      Does that mean that all of those variables should be in the constructor?
      No.