加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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的开发版本中也没有.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读