perl – 如何将模块范围限制为子程序?
发布时间:2020-12-15 23:27:16 所属栏目:大数据 来源:网络整理
导读:如果我运行下一个脚本: use strict;use warnings;sub load { use File::Path qw (make_path);}load();make_path('1/2/3/4');exit 0; 它完美地运作.我想将加载模块的范围限制在子例程中,这样我就不能使用在加载它的子例程之外的模块中声明的子例程.可能吗?
如果我运行下一个脚本:
use strict; use warnings; sub load { use File::Path qw (make_path); } load(); make_path('1/2/3/4'); exit 0; 它完美地运作.我想将加载模块的范围限制在子例程中,这样我就不能使用在加载它的子例程之外的模块中声明的子例程.可能吗? 解决方法
简短回答:不,这不太可能.
答案很长:加载File :: Path之后,你无法阻止代码调用File :: Path :: make_path(),但你可以通过短名称来限制可用范围. use File::Path (); sub load { local *make_path = &;File::Path::make_path; make_path('foo/bar/baz'); # This would work... } File::Path::make_path('bang/kapow'); # This would work too make_path('xyxxy/plugh'); # But this would die 但是通过使用local,范围在词法上不限于语法代码块.它是动态范围的,这意味着load()调用的所有代码也会将make_path视为工作子例程. 我建议不要使用这种技术,因为它有点模糊,可能有一些难以解释的远处副作用.我发现它主要用于编写单元测试,它可以用于用模拟替换一些函数. Perl开发人员正在讨论添加词汇subs作为语言的一部分.此功能应该允许您几乎完成您想要的操作而不会出现使用本地问题.但是这仍然在进行中,甚至在perl的开发版本中也没有. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |