我有一些自动产生的代码,从而有效地写出以下一堆不同的地方在一些代码:

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

perldoc perlguts说:

   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,我不知道。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top