in reply to trouble with evaluate

On the face of it what you want to do is trivial. Consider the following:

use strict; use warnings; package Parser; sub new { my ($class, %params) = @_; return bless \%params, $class; } sub parse { my ($self, $inFile) = @_; while (<$inFile>) { chomp; my ($var, $value) = split; $self->{$var} = $value; } } sub getVar { my ($self, $varName) = @_; return $self->haveVar ($varName) ? $self->{$varName} : undef; } sub haveVar { my ($self, $varName) = @_; return exists $self->{$varName}; } package main; my $parser = Parser->new (); $parser->parse (*DATA); print "var1 = ", $parser->getVar ('var1') if $parser->haveVar ('var1') +; __DATA__ var1 wibble var2 plonk var4 dibbly

Prints:

var1 = wibble
True laziness is hard work

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

    Thank you! You guys are really amazing. I think your approach is basically the same as what sundialsvc4 was suggesting. I'm still struggling to grasp how Perl objects work. JavaFan wrote "A Perl object is a reference that's blessed into a package", and if I understand your code right, the reference in this case is to the hash that contains the parameters ("bless \%params, $class"). I agree that what I'm trying to do is trivial, but I am none the wiser about why none of the other versions suggested worked, except that the evaluation of the passed variable name was problematic.

      Perl objects are a reference to something (hash, scalar, array, code, ... - it doesn't much matter what) with a little magic stirred in. See Not quite an OO tutorial for a light weight introduction to Perl OO.

      The trap in Perl is that, without strictures (use strict; use warnings; - which you should always use btw.) you can do some pretty hairy stuff that looks like it might be fine and just what you want to do, but is really full of nasty lurking traps. The nasty thing that most often looks ok is called "symbolic references" where you use the contents of a variable to access another variable by name. Pretty much always you can replace the referenced variable by a hash element where the variable name is the key to the hash.

      For the task at hand it is convenient to turn the hash into an object that knows how to parse an input file (or whatever) and provides convenient access to the parsed variables. This is a pretty light weight use of OO, but it is likely to provide significant payback if you need to add value to the data, like combining the values of actual variables into pseudo variables which can be accessed just like the actual variables.

      True laziness is hard work
      ... I am none the wiser about why none of the other versions suggested worked ...

      genghis: You might get even more and better help and make more headway if, when you say something like "it didn't work", you would also give the other monks a small, self-contained, runnable example of the "it" in question, along with input and expected output. The very process of putting together such an example can often provide you great enlightenment.