in reply to symbol table vs. eval

This will do what you want, I think:

my $test="my_variable_name"; my $default_value="the value I set"; $$test = "old value"; print "the value of \$my_variable_name = $my_variable_name\n"; $my_variable_name = "A new value"; print "the value of \$my_variable_name = $my_variable_name\n";

... but don't do that :)

Update: Perhaps I read & posted too quickly, does this do what you want?

my $test="my_variable_name"; my $default_value="the value I set"; $default_value = *$test; $$default_value = "old value"; print "the value of \$my_variable_name = $my_variable_name\n"; $my_variable_name = "A new value"; print "the value of \$my_variable_name = $my_variable_name\n";

Update2: Thanks ikegami. You'll notice I omitted the obligatory "use strict;" and "use warnings;", because when they're not omitted:

$ perl symbol.pl Global symbol "$my_variable_name" requires explicit package name at sy +mbol.pl line 12. Global symbol "$my_variable_name" requires explicit package name at sy +mbol.pl line 13. Global symbol "$my_variable_name" requires explicit package name at sy +mbol.pl line 14. Execution of symbol.pl aborted due to compilation errors.


--chargrill
$/ = q#(\w)# ; sub sig { print scalar reverse join ' ', @_ } + sig map { s$\$/\$/$\$2\$1$g && $_ } split( ' ', ",erckha rlPe erthnoa stJu +" );

Replies are listed 'Best First'.
Re^2: symbol table vs. eval
by raflach (Pilgrim) on Feb 23, 2006 at 18:49 UTC

    A clear case of my overthinking the problem. Your first example does what I am needing. However I wonder if you can explain why the following occurs:

    Code:
    package apackage; my $test="my_variable_name"; my $default_value="the value I set"; $$test = $default_value; print "the value of \$my_variable_name = $my_variable_name\n"; package main; $my_variable_name = "A new value"; print "the value of \$my_variable_name = $my_variable_name\n"; print "the value of the package variable = $apackage::my_variable_name +\n";
    Output:
    the value of $my_variable_name = the value I set the value of $my_variable_name = A new value the value of the package variable = the value I set

    which works and is what I need,

    but...

    Code:
    package apackage; my $test="my_variable_name"; my $default_value="the value I set"; our $$test = $default_value; print "the value of \$my_variable_name = $my_variable_name\n"; package main; $my_variable_name = "A new value"; print "the value of \$my_variable_name = $my_variable_name\n"; print "the value of the package variable = $apackage::my_variable_name +\n";
    Output:
    Can't declare scalar dereference in our at -e line 5, near "$test =" Execution of -e aborted due to compilation errors.

      You need to use our $my_variable_name; You may thing hardcoding the name is a problem, but it's not. The only reason you need our is because you hardcoded the name in the print. For example,

      use strict; use warnings; package Hack; sub slash { my $var_ref = do { no strict 'refs'; \${'ExistingPackage::var'} }; $$var_ref = 'bar'; } package main; ExistingPackage->print_it(); Hack->slash(); ExistingPackage->print_it();
      whether ExistingPackage is
      use strict; use warnings; package ExistingPackage; our $var = 'foo'; sub print_it { print("$var\n"); } 1;
      or
      package ExistingPackage; $var = 'foo'; sub print_it { print("$var\n"); } 1;

        yes but imagine the following situation

        include_file.pl (this is the only file I can edit)
        my $test="my_variable_name"; # I pulled this from the db. I have no +idea what it actually is, plus I need to be able to support arbitrary + additions to the db anyway my $default_value="the value I set"; $$test = $default_value;

        module.pm (I can't touch this file)
        use strict; package apackage; do "include_file.pl"; print "the value of \$my_variable_name = $my_variable_name\n"; # I can +'t control the fact that this variable is being referred to without i +ts package name

        script.pl (this is the code that will be run. I also can't touch it)
        use strict; use module; $my_variable_name = "A new value"; print "the value of \$my_variable_name = $my_variable_name\n"; #print +the local value print "the value of the package variable = $apackage::my_variable_name +\n"; # print the package value
        The question is how do I while only modifying the include file avoid failing use strict. While still allowing the module file to access the variable by name directly and the script file to access it by package.

      Hrm. Note where I declare vars:

      package apackage; my $test="my_variable_name"; my $default_value="the value I set"; $$test = $default_value; print "the value of \$my_variable_name = $my_variable_name\n"; package main; $my_variable_name = "A new value"; our $test; print "the value of \$my_variable_name = $my_variable_name\n"; print "the value of the package variable = $apackage::my_variable_name +\n";

      Yields:

      the value of $my_variable_name = the value I set the value of $my_variable_name = A new value the value of the package variable = the value I set


      --chargrill
      $/ = q#(\w)# ; sub sig { print scalar reverse join ' ', @_ } + sig map { s$\$/\$/$\$2\$1$g && $_ } split( ' ', ",erckha rlPe erthnoa stJu +" );
Re^2: symbol table vs. eval
by ikegami (Patriarch) on Feb 23, 2006 at 18:45 UTC
    Caveat: Your solution won't work if $my_variable_name is a lexical (my) variable. It will only work if it's a package (our) variable.
      I am working with package variables, so in this case I'm OK, but I do wonder why I can't declare it using 'our' (see my post below). Thanks!
Re^2: symbol table vs. eval
by ikegami (Patriarch) on Feb 23, 2006 at 18:53 UTC

    Concerning your update, strict has nothing to do with it. If use strict is already present, so is either our $my variable_name; or my $my variable_name;. I was saying your code will only work with the former, not the latter. The OP's code (and the code in my reply) works with both.