Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^2: symbol table vs. eval

by raflach (Pilgrim)
on Feb 23, 2006 at 18:49 UTC ( [id://532359]=note: print w/replies, xml ) Need Help??


in reply to Re: symbol table vs. eval
in thread symbol table vs. eval

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.

Replies are listed 'Best First'.
Re^3: symbol table vs. eval
by ikegami (Patriarch) on Feb 23, 2006 at 18:59 UTC

    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.

        There more than one kind of strict errors. Undeclared variables will lead to strict errors. my and our help fix these errors. However, the error in include_file.pl is not caused by undeclared variables. It's caused by using symbolic references. It's possible to write code that fetches a reference to a symbol while being strict-friendly, but it's much simple to temporarily disable checks for symbolic references. That can be done as follows:

        # include_file.pl # Pulled from the DB. my $test = "my_variable_name"; my $default_value = "the value I set"; my $var_ref = do { no strict 'refs'; \${$test} }; $$var_ref = $default_value;

        By the way, script.pl doesn't compile. I'm going to assume your real script.pl doesn't have that problem.

Re^3: symbol table vs. eval
by chargrill (Parson) on Feb 23, 2006 at 19:03 UTC

    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 +" );

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://532359]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others rifling through the Monastery: (6)
As of 2024-04-19 17:19 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found