当前位置:  开发笔记 > 编程语言 > 正文

如何在不同的堆栈框架中本地化Perl变量?

如何解决《如何在不同的堆栈框架中本地化Perl变量?》经验,为你挑选了2个好方法。

我有一些自动生成的代码,可以在一些代码中的一些不同的地方有效地写出以下内容:

no warnings 'uninitialized';
local %ENV = %ENV;
local $/   = $/;
local @INC = @INC;
local %INC = %INC;
local $_   = $_;
local $|   = $|;
local %SIG = %SIG;
use warnings 'uninitialized';

当自动生成代码时,有些人认为代码并不是绝对必要的"漂亮",但是我想把它拉到子程序中.但是,这将在该子例程中本地化这些变量.有没有办法在调用堆栈框架中本地化这些变量?

更新:以类似的方式,能够在更高的堆栈帧中运行eval会很好.我认为Python已经有了这个.如果Perl也这样做会很好.



1> hexten..:

也许您可以安排使用这些本地生成的代码作为闭包生成?那你可以

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
});


D'哦!回想起来,这是令人尴尬的显而易见:)因为我自动生成代码,这是微不足道的.
将它与Sub :: Uplevel结合起来,使代码甚至不知道它被包装.uplevel 2,$ sub - >(@ args);

2> Adam Bellair..:

不确定为什么QuantumPete正在被投票,他似乎是正确的.你无法告诉local初始化调用块中的变量.它的功能很特殊,它的初始化/拆卸只能在运行它的块上运行.

有一些实验模块,比如Sub :: Uplevel和Devel :: RunBlock,它们允许你试图"愚弄" caller()子程序或者将值的"长跳转"返回到更高的堆栈帧(分别),但这些都没有什么影响local对待变量(我试过.:)

所以到目前为止,确实看起来你必须使用你需要它们的范围内的本地声明.

推荐阅读
个性2402852463
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有