我有一些自动生成的代码,可以在一些代码中的一些不同的地方有效地写出以下内容:
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 });
不确定为什么QuantumPete正在被投票,他似乎是正确的.你无法告诉local
初始化调用块中的变量.它的功能很特殊,它的初始化/拆卸只能在运行它的块上运行.
有一些实验模块,比如Sub :: Uplevel和Devel :: RunBlock,它们允许你试图"愚弄" caller()
子程序或者将值的"长跳转"返回到更高的堆栈帧(分别),但这些都没有什么影响local
对待变量(我试过.:)
所以到目前为止,确实看起来你必须使用你需要它们的范围内的本地声明.