perl – ‘Exporter’,’use vars’和’local’之间的互动
发布时间:2020-12-15 21:43:37 所属栏目:大数据 来源:网络整理
导读:我试图将此行为归结为最简单的测试用例.考虑以下两个模块: Bar.pm package Bar;use base 'Exporter';use vars qw/ $BarVar /;BEGIN { @EXPORT_OK = qw/ $BarVar /; }$BarVar = 'original';1; Foo.pm package Foo;use Bar qw/ $BarVar /;sub foo { print $Ba
我试图将此行为归结为最简单的测试用例.考虑以下两个模块:
Bar.pm package Bar; use base 'Exporter'; use vars qw/ $BarVar /; BEGIN { @EXPORT_OK = qw/ $BarVar /; } $BarVar = 'original'; 1; Foo.pm package Foo; use Bar qw/ $BarVar /; sub foo { print $BarVar . "n"} 1; 现在,以下脚本的输出 – use strict; use warnings; use Foo; { local $Bar::BarVar = 'modified'; Foo::foo(); } Foo::foo(); 是“原始”打印两次,我希望它被“修改”后跟“原始”,因为我希望本地声明在整个范围内替换包变量$Bar :: BarVar,其中包括首先调用foo().解释是什么?我怎样才能在本地覆盖$Bar :: BarVar? 解决方法
您可能听说过我和我们的创建变量(后者是别名),但是本地只是对值进行临时备份.
我撒了谎. 本地确实进行备份,但不进行备份.它备份相关标量的地址,创建新标量,并将名称与新标量相关联.在这种情况下,使$Bar :: BarVar引用新标量,$Foo :: BarVar引用旧标量. $perl -E' *x = $y; say $x," - ",$y; local $y; say $x,$y; ' SCALAR(0x44d7c70) - SCALAR(0x44d7c70) SCALAR(0x44d7c70) - SCALAR(0x44ba130) 如果您实际上只是备份值,问题就会消失. use Sub::ScopeFinalizer qw( scope_finalizer ); { my $backup = $Bar::BarVar; my $guard = scope_finalizer { $Bar::BarVar = $backup }; $Bar::BarVar = 'modified'; Foo::foo(); } 可能存在更专业的工具. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |