题
我有一些自动产生的代码,从而有效地写出以下一堆不同的地方在一些代码:
no warnings 'uninitialized';
local %ENV = %ENV;
local $/ = $/;
local @INC = @INC;
local %INC = %INC;
local $_ = $_;
local $| = $|;
local %SIG = %SIG;
use warnings 'uninitialized';
当自动产生的代码,一些人认为,这不是严格必要的,该代码是"漂亮的",但我想到拉那成为一个子程序。然而,这将本地化,这些变量在于,子程序。有没有办法本土化,这些变量的呼吁堆的框架?
更新:与此类似,这将是很好的能够运行eval在一个更高的堆的框架。我认为蟒蛇已经拥有这个。这将是好的,如果Perl也知道。
解决方案
也许您可以安排使用这些本地生成的代码作为闭包生成?那么你可以
sub run_with_env {
my ($sub, @args) = @_;
no warnings 'uninitialized';
local %ENV = %ENV;
local $/ = $/;
local @INC = @INC;
local %INC = %INC;
local 也许您可以安排使用这些本地生成的代码作为闭包生成?那么你可以
<*> = 也许您可以安排使用这些本地生成的代码作为闭包生成?那么你可以
<*>;
local $| = $|;
local %SIG = %SIG;
use warnings 'uninitialized';
$sub->(@args);
}
run_with_env(sub {
# do stuff here
});
run_with_env(sub {
# do different stuff here
});
其他提示
不知道为什么QuantumPete正在downvoted,他似乎就在这一个。你不能告诉 local
初始化的变量的呼吁块。其功能是特别的,与初始化/清除,它不仅适用于框它运行。
有一些实验模块,例如 分::上级 和 开发::RunBlock 这能让你尝试"傻瓜" caller()
对于子程序或做'只要跳回'的价值较高的堆框架(分别),但是这些都不做任何事会影响 local
对待变量(我尝试。:)
所以现在,它的确看起来像你将要住的地方声明的范围在哪里你需要他们。
我对Perl并不十分熟悉,请原谅我,如果它真的可行的话。但通常,堆栈帧本地的变量仅在该堆栈帧中可用。您无法从更高或更低的位置访问它们(除非您执行一些hacky指针算法,但从未保证成功)。 不幸的是,大块的变量声明是你不得不忍受的。
QuantumPete
The "Alias" module implements localization of the basic types within
the caller's scope. People who are interested in how to localize
things in the containing scope should take a look there too.
FWIW。我没有仔细查看Alias.pm,看看它有多容易。
在TCL中,您可以使用 uplevel 。至于Perl,我不知道。
Perl有 Sub :: Uplevel