大佬教程收集整理的这篇文章主要介绍了perl – ‘Exporter’,’use vars’和’local’之间的互动,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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(); }
可能存在更专业的工具.
以上是大佬教程为你收集整理的perl – ‘Exporter’,’use vars’和’local’之间的互动全部内容,希望文章能够帮你解决perl – ‘Exporter’,’use vars’和’local’之间的互动所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。