Exporter - 实现默认的导入方法用于模块
- Exporter - 实现默认的导入方法用于模块
- 简介:
- In module YourModule.pm:
- package YourModule;
- require Exporter;
- @ISA = qw(Exporter);
- @EXPORT_OK = qw(munge frobnicate); # symbols to export on request 导出的符号
- Vsftp:/root/perl/7# cat scan1.pm
- package scan1;
- require Exporter;
- @ISA = qw(Exporter);
- @EXPORT_OK = qw(fun1 frobnicate); ###导出fun1函数
- sub fun1() {
- my $a=shift;
- my $b=shift;
- return 67 + $a + $b;
- };
- Vsftp:/root/perl/7# cat a7.pl
- unshift(@INC,"/root/perl/7");
- use scan1 qw(fun1);
- my $var=&fun1(3,4);
- print $var;
- print "\n";
- Vsftp:/root/perl/7# perl a7.pl
- 74
- package YourModule;
- use Exporter 'import'; # gives you Exporter's import() method directly
- @EXPORT_OK = qw(munge frobnicate); # symbols to export on request
- Vsftp:/root/perl/7# cat scan02.pm
- package scan02;
- use Exporter 'import'; # gives you Exporter's import() method directly
- @EXPORT_OK = qw(fun2 frobnicate); # symbols to export on reques
- sub fun2() {
- my $a=shift;
- return $a -2;
- };
- 1;
- Vsftp:/root/perl/7# cat a8.pl
- unshift(@INC,"/root/perl/7");
- use scan02 qw(fun2);
- my $var=&fun2(10);
- print $var;
- print "\n";
- Vsftp:/root/perl/7# perl a8.pl
- 8
- 描述:
- Exporter 模块实现一个简单的方法 允许一个模块来导出函数和变量到它用户的名字空间。
- 很多模块使用Exporter 而不是实现他们自己的导入方法
- 因为Exporter提供了 一个 高度灵活的接口.
- Perl 自动调用import 方法 当处理一个使用的声明对于一个模块,
- 模块使用时在perlfunc and perlmod中说明。
- 了解模块的内容和如何使用语句 是重要的对于了解Exporter
- 如何Export
- 数组 @EXPORT and @EXPORT_OK 在一个模块里持有符号的列表,准备导出到用户的名字空间默认情况下,
- 或者它们可以请求被导出,分别的。
- 符号可以代表函数,标量,数组,hashes 或者符号表。
- 符号必须是全名 ,函数前的&是可选的
- @EXPORT = qw(afunc $scalar @array); # afunc is a function
- @EXPORT_OK = qw(&bfunc %hash *typeglob); # explicit prefix on &bfunc
- 如果你只是希望导出函数名字 推荐省略&,这种方式是更快的
- 选择需要导出的
- 不要导出方法名字!
- 不要导出任何除非是默认的
- Exports 污染模块用户的名字空间, 如果你必须export 尝试使用@EXPORT_OK优先于@EXPORT
- 避免短的或者公用的符号名字来创建名字冲突的风险
- 通常 任何不被导出是访问可以从模块外部访问 使用YourModule::item_name (or $blessed_ref->method)
- Vsftp:/root/perl/7# cat scan02.pm
- package scan02;
- sub fun2() {
- my $a=shift;
- return $a -2;
- };
- 1;
- Vsftp:/root/perl/7# cat a9.pl
- unshift(@INC,"/root/perl/7");
- use scan02 ;
- my $var=&scan02::fun2(10);
- print $var;
- print "\n";
- Vsftp:/root/perl/7# perl a9.pl
- 8
- 按惯例 你可以使用一个下划线在名字前来表明它们是内部的 不是公用使用的
- 它实际是得到私有函数通过:
- my $subref = sub { ... };
- $subref->(@args); # Call it as a function
- $obj->$subref(@args); # Use it as a method
- 然而你可以使用它们的方法 由你来弄清楚 如何继承工作
- 作为一个一般性规则,如果模块是尝试被面向对象的那么export nothing.
- 如果它只是一个函数的集合 那么 @EXPORT_OK 任何除了使用谨慎使用@EXPORT
- 如何导入:
- 从其他文件 你希望使用你的模块 有3个基本的方式用来加载你的模块和导入他的符号:
- use YourModule;
- 这个导入所有的符号 从 YourModule's @EXPORT 到你的名字空间
- use YourModule ();
- 这个导致Perl来加载模块但是不导入任何符号
- use YourModule qw(...);
- 这个只导入 列出的符号通过调用者到它们的名字空间。
- 所有列出的符号必须在你的r @EXPORT or @EXPORT_OK, 否则一个错误发生。
- 高级功能;
- 指定导入的列表:
- 如果 条目的任何在一个导入的列表开始以!, : or / 那么列表是对待为一个特定的系列,
- 从列表添加或者删除来导入, 他们处理是从左到右的 特定的格式
- [!]name This name only
- [!]:DEFAULT All names in @EXPORT
- [!]:tag All names in $EXPORT_TAGS{tag} anonymous array
- [!]/pattern/ All names in @EXPORT and @EXPORT_OK which match
- 以!开始的 表明 匹配的名字应该是从列表中删除来导入。
- 如果第一个指定的是一个删除 他是对待为之前通过 :DEFAULT.
- 如果你需要导入额外的名字除了默认设置 你希望仍旧包含 :DEFAULT
Exporter - 实现默认的导入方法用于模块的更多相关文章
- Python全栈之路----常用模块学习----模块的种类和导入方法
什么是模块? 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码 ...
- import 语句用于导入从外部模块,另一个脚本等导出的函数,对象或原语。
import 语句用于导入从外部模块,另一个脚本等导出的函数,对象或原语. 注意:此功能目前无法在任何浏览器中实现.它在许多转换器中实现,例如 Traceur Compiler , Babel , R ...
- 详解Python模块导入方法
python常被昵称为胶水语言,它能很轻松的把用其他语言制作的各种模块(尤其是C/C++)轻松联结在一起.python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的 ...
- Python3 第五周大纲(模块,导入方法、import本质,导入优化,模块的分类)
1.定义: 模块:逻辑上组织python代码(变量.函数.类.逻辑:实现一个功能,本质是.py结尾的文件) 2.导入方法 import module_name,module_name2,...... ...
- appium导入哪些java模块
简单介绍 讲解一个appium测试脚本需要导入哪些java模块. 导入的java模块 明确两点信息: 一个脚本需要讲清楚测试环境:1.自动化平台方面,测试的平台是什么(appium或者selendro ...
- 模块的四种形式、 import和from...import、 循环导入问题、模块的搜索路径、 python文件的两种用途
目录 模块的四种形式 模块 模块的四种形式 import和from...import 循环导入问题 模拟问题的发生: 解决方案 模块的搜索路径 Python文件的两种用途 模块的四种形式 Nike推荐 ...
- 接口(Interfaces)与反射(reflection) 如何利用字符串驱动不同的事件 动态地导入函数、模块
标准库内部如何实现接口的 package main import ( "fmt" "io" "net/http" "os" ...
- mysql 文件导入方法总结
数据导入3三种方法 一.phpMyAdmin 限制大小:2M 1.创建数据库 2.导入.sql或.sql.zip文件 大数据导入方法一:http://jingyan.baidu.com/article ...
- Fundebug前端JavaScript插件更新至1.6.0,新增test()方法用于测试
摘要: 1.6.0新增fundebug.test()方法用于测试,请大家及时更新. 默认情况下,Fundebug 插件能够自动捕获未处理的错误(uncaught error).另外,开发者也可以通过使 ...
随机推荐
- JVM内存模型以及垃圾收集策略解析
http://xmuzyq.iteye.com/blog/599750 一 JVM内存模型 1.1 Java栈 Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程. ...
- android线程池ThreadPoolExecutor的理解
android线程池ThreadPoolExecutor的理解 线程池 我自己理解看来.线程池顾名思义就是一个容器的意思,容纳的就是ThreadorRunable, 注意:每一个线程都是需要CPU分配 ...
- 数据库性能优化一:SQL索引一步到位
SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...
- 产品原型设计5:移动App原型设计神器 - POP(Prototyping on Paper)
一般来说,苦逼的互联网产品经理们都知道 Axure 这个原型设计工具,一方面是因为它提供了足够简单的拖拽操作,易上手,且有很多模板方便复用:另一方是因为它可直接输出html,直接在浏览器里给团队成员和 ...
- CDN调度器HAProxy、Nginx、Varnish
http://www.ttlsa.com/web/the-cdn-scheduler-nginx-haproxy-varnish/ CDN功能如下:1.将全网IP分为若干个IP段组,分组的依据通常是运 ...
- android使用广播退出应用程序
由于在(Widget或Service.BroadcastReceiver中)使用startActivity()方法启动activity时需使用FLAG_ACTIVITY_NEW_TASK flag,所 ...
- new Date() 倒计时
js中单独调用new Date() 显示的结果是:Fri May 20 2015 20:00:00 GMT+0800这种格式的时间 JS获取当前时间戳的方法 JavaScript 获取当前时间戳: 第 ...
- javax.el.PropertyNotFoundException: Property 'aDesc' not found on type
这个问题是是在我使用jeesite自动代码是产生的,原因是实体类的属性命名规范不合格,我在网上看到类的属性前三个字母不能出现大写 解决办法:将类的属性大小写改一下
- MySQL常见错误类型
MySQL常见错误类型:1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010: ...
- C#实现JSON序列化与反序列化介绍
方法一:引入System.Web.Script.Serialization命名空间使用 JavaScriptSerializer类实现简单的序列化 序列化类:Personnel public clas ...