Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

i want to change the symbol table entry of a varaible so that i can continue to use the variable name.

here is a simplistic example. i've tried the commented lines and more!

what am i missing? is there another way to do this without using symbolic variables?

the <code> tag doesn't work for me; so i inserted breaks by hand

my $varA = "this is varA"; my $varB = "this is varB"; my $varC; print "\n"; ## my @vars = ( $varA, $varB, $varC ); my @vars = ( \$varA, \$varB, \$varC ); foreach my $f ( @vars ) { if ( defined $$f ) { print "--- $$f \n"; my $tmp = $$f . " and some more "; print "----- $tmp \n"; no strict 'refs'; ## ${$f} = $tmp; ## ${"f"} = $tmp; ## my $ref = \$f; $ref = $tmp; my $f = \$tmp; use strict; print "===== $$f \n"; } } print "\n"; foreach my $f ( @vars ) { print "+ $f \n"; } print "\n";

Replies are listed 'Best First'.
Re: symbolic references
by dragonchild (Archbishop) on Sep 27, 2005 at 19:05 UTC
    Any time you think about using symbolic references, you should immediately think of using a hash.
    use strict; use warnings; # Assuming you're using Perl 5.6.0 and higher my %vars = ( 'A' => 'This is varA', 'B' => 'This is varB', 'C' => '', ); my @vars = qw( A B C ); foreach my $varname ( @vars ) { print "$varname is $vars{ $varname }\n"; }
    As for what you're doing wrong, lexical variables don't enter the symbol table. And, if you don't understand that statement, then you really shouldn't be playing with symbolic references. Hashes, my brother. Hashes.

    My criteria for good software:
    1. Does it work?
    2. Can someone else come in, make a change, and be reasonably certain no bugs were introduced?

      thanks for your prompt reply.
      i was able to get the following to work :

      my @vars = ( \$varA, ) # symbol table entry

      $$f = $tmp; # change the table entry only

      @vars = ( $varA, ) # now print the variables
      i guess i follow your hash usage. it just seems redundant to this naive user.
      thanks again for your help
        i guess i follow your hash usage. it just seems redundant to this naive user.

        It's redundant only if you intend to run your code once, then delete it. If that is not the situation, then it most definitely is not redundant. What the hash does is increase readability. Anytime you increase readability in code that you don't intend on deleting immediately, that is a win-win. The first win comes when you are writing the code, because it reduces the chance for bugs. The second win is when you're modifying the code, because it reduces the chance for bugs.

        Remember - computers only understand 1's and 0's. Programming languages aren't meant for computers - they're meant for humans. Every feature in a programming language is for a human to use, not a computer. So, if there's a feature that can reduce bugs, you are a fool to not use it.


        My criteria for good software:
        1. Does it work?
        2. Can someone else come in, make a change, and be reasonably certain no bugs were introduced?
Re: symbolic references
by tall_man (Parson) on Sep 27, 2005 at 19:21 UTC
    Here's another way. The "foreach" statement automatically aliases the loop variable to the items in the list, so you could just do:
    use strict; my $varA = "this is varA"; my $varB = "this is varB"; my $varC; print "\n"; foreach my $f ($varA, $varB, $varC) { if ( defined $f ) { print "--- $f \n"; my $tmp = $f . " and some more "; print "----- $tmp \n"; $f = $tmp; print "===== $f \n"; } } print "\n"; foreach my $f ( $varA, $varB, $varC ) { print "+ $f \n"; } print "\n";
Re: symbolic references
by InfiniteSilence (Curate) on Sep 27, 2005 at 19:09 UTC
    You might want to read about Perl Namespaces. Why couldn't you use the <code> tag?

    Celebrate Intellectual Diversity


      as stated in the question, the "br" tag worked, the <code> tag didn't. ( not even here! :-) )
        Did you, by chance, forget to include a 'closing' </code> tag.