http://www.perlmonks.org?node_id=541368


in reply to Re: eval a reference to a my hash
in thread eval a reference to a my hash

Nice solution, I wanted to get rid of the eval anyway. Thanks!
I would still love to know why the original doesn't work.

Replies are listed 'Best First'.
Re^3: eval a reference to a my hash
by chromatic (Archbishop) on Apr 05, 2006 at 17:48 UTC

    By the time the eval STRING code runs, lexicals don't really have names anymore, so Perl can't look them up by name.

      And that explains why making them our variables fixes the problem. Many thanks (I'm using an extra hash now and got rid of the eval, but it is worth knowing).
      Cheers
Re^3: eval a reference to a my hash
by liverpole (Monsignor) on Apr 05, 2006 at 18:00 UTC
    When you say the original doesn't work, what makes you think it isn't?

    It seems your simplified fragment is not demonstrating the problem, because:

    #!/usr/bin/perl -w + # Strict use strict; use warnings; + # Libraries use Carp; use Data::Dumper; + + my %drink; # other attribute hashes + set('larry', 'drink', 'Old Speckled Hen'); print $drink{'larry'}, "\n"; # print "Dump(\%drink) => [%s]\n", Dumper(\%drink); + + sub set { my ($key, $attr, $value) = @_; + my $hashref; eval "\$hashref = \\\%$attr"; + if ( !defined $hashref ) { carp 'Invalid attribute name'; } else { $hashref->{$key} = $value; } }
    is working for me:
    % prog541345.pl Old Speckled Hen
    If that isn't what you're getting, please compare the above code fragment (based on what you provided in your post) to your actual code, and see if that helps locate the problem.

    s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/
      It works because of the print statement. Take that out and it will fail. Thanks anyway.