Perl:访问';我的';来自另一个文件的变量
我们有一个用于执行维护的Perl脚本。我需要修改它来处理更多的任务。问题是脚本已编译,而源代码早就丢失了 我尝试使用B::Deparse来重新创建文件,但Deparse并不完美,输出也不完整(并且有非常大的~5000行Deparse代码) 在阅读了deparsed代码之后,我发现我需要修改一个函数。编译后的脚本加载一个纯文本脚本模块,因此我修改了该模块以覆盖该函数并执行我需要它执行的任务。现在的问题是我无法访问主脚本“my”变量 下面是一个例子:Perl:访问';我的';来自另一个文件的变量,perl,Perl,我们有一个用于执行维护的Perl脚本。我需要修改它来处理更多的任务。问题是脚本已编译,而源代码早就丢失了 我尝试使用B::Deparse来重新创建文件,但Deparse并不完美,输出也不完整(并且有非常大的~5000行Deparse代码) 在阅读了deparsed代码之后,我发现我需要修改一个函数。编译后的脚本加载一个纯文本脚本模块,因此我修改了该模块以覆盖该函数并执行我需要它执行的任务。现在的问题是我无法访问主脚本“my”变量 下面是一个例子: # main.pl my $a = 1; s
# 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{…}。你说的“编译脚本”是什么意思。你是说打包?我同意池上的观点,可能有某种方法可以恢复脚本,但要知道,我们需要知道你所说的“编译”是什么意思。