如何将Perl变量定位在不同的堆栈框架中?

我有一些自动生成代码,有效地写出以下在一些不同的地方在一些代码
no warnings 'uninitialized';
local %ENV = %ENV;
local $/   = $/;
local @INC = @INC;
local %INC = %INC;
local $_   = $_;
local $|   = $|;
local %sIG = %sIG;
use warnings 'uninitialized';

自动生成代码时,有人认为不是严格必须的代码是“美丽的”,但我想把它拉进一个子程序。但是,这会将那些变量定位在该子程序中。有没有办法本地化这些变量在调用堆栈帧?

更新:在类似的情况下,它将是很高兴能够运行eval在更高的堆栈帧。我认为Python已经有这个。这将是很好,如果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
});

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...