Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl:访问';我的';来自另一个文件的变量_Perl - Fatal编程技术网

Perl:访问';我的';来自另一个文件的变量

Perl:访问';我的';来自另一个文件的变量,perl,Perl,我们有一个用于执行维护的Perl脚本。我需要修改它来处理更多的任务。问题是脚本已编译,而源代码早就丢失了 我尝试使用B::Deparse来重新创建文件,但Deparse并不完美,输出也不完整(并且有非常大的~5000行Deparse代码) 在阅读了deparsed代码之后,我发现我需要修改一个函数。编译后的脚本加载一个纯文本脚本模块,因此我修改了该模块以覆盖该函数并执行我需要它执行的任务。现在的问题是我无法访问主脚本“my”变量 下面是一个例子: # main.pl my $a = 1; s

我们有一个用于执行维护的Perl脚本。我需要修改它来处理更多的任务。问题是脚本已编译,而源代码早就丢失了

我尝试使用B::Deparse来重新创建文件,但Deparse并不完美,输出也不完整(并且有非常大的~5000行Deparse代码)

在阅读了deparsed代码之后,我发现我需要修改一个函数。编译后的脚本加载一个纯文本脚本模块,因此我修改了该模块以覆盖该函数并执行我需要它执行的任务。现在的问题是我无法访问主脚本“my”变量

下面是一个例子:

# main.pl

my $a = 1;

sub call_me {
    print "unmodified";
}

use MOD;

call_me;


MOD.pm
package MOD;

main::{'call_me'} = sub {
    print "\$main::a = $main::a\n";
}
结果是:“
$main::a=
”而不是获取实际值


提前感谢。

简单的回答是,在其词法范围之外无法访问用
my
声明的变量。如果您不能将声明更改为“我们的”(因为原始脚本的疯狂“编译”性质),那么您还不是运气不佳。Perl几乎总是提供一种解决这些问题的方法

在这种情况下,您可以安装模块并执行类似操作(这里是您最初发布的代码的调整版本):

main.pl
脚本:

my $a = 1;

sub call_me {
    print "unmodified: $a";
}

use MOD;

call_me;
然后是您的模块:

package MOD;

# closed_over($code_ref) returns a hash ref keyed on variable
# name(including sigil) with values as references to the value
# of those variables
use PadWalker qw(closed_over);

{
    # grab a reference to the original sub
    my $orig = \&main::call_me;

    # no need to use the symbol table, a glob reference is fine
    # but you can't use sub main::call_me { ... } either
    *main::call_me = sub {
        my $a = closed_over($orig)->{'$a'};
        print "\$main::a = $$a\n";
    }
}

如果你有什么特别想要的东西,这里有一行。。根据需要扩展


perl-e'$foo=eval(
cat./my.pl
“return\$some\u my\u var;”);打印“$foo”

词法变量(
my
)不会出现在包的符号表中,这与包全局变量不同。所以这是一个艰难但有趣的故事…#旁注:如果我没记错的话,你可以简单地编写sub-main::call_-me{…}。你说的“编译脚本”是什么意思。你是说打包?我同意池上的观点,可能有某种方法可以恢复脚本,但要知道,我们需要知道你所说的“编译”是什么意思。