Perl包相关
名称冲突问题
假如在sum2.pm中使用require导入了一个代码文件sum1.pm:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
require '/perlapp/sum1.pm';
sub sum {
say "sum2: sum()";
}
1;
如果在sum1.pm中也有一个sum子程序:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
sub sum {
say "sum1: sum()";
}
1;
那么在运行sum2.pm的时候,将警告子程序重新定义。因为sum2.pm首先编译好自己的sum(),然后在运行期间require导入文件时,又再次定义sum(),将进行覆盖操作:
Subroutine sum redefined at /perlapp/sum1.pm.....
这样的名称冲突问题,通过声明包来解决。
定义包和访问包属性
要定义一个包,只需要加上关键字package即可。
package PKG_NAME [ VERSION_NUM ];
上面的语句用于声明包,可以带上包版本号,例如package pkg1 0.01;。
例如,在sum1.pm中:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
package Sum1;
sub sum {
say "pkg:Sum1,sum()";
}
1;
然后其它文件导入sum1.pm后,就可以使用包名::属性的方式访问sum1.pm中的属性,如子程序。
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
require '/perlapp/sum1.pm';
sub sum {
say "file: sum2,sum()";
}
sum(); # 访问本文件定义的sum子程序
Sum1::sum(); # 访问包Sum1::sum子程序,括号不能少
1;
除了子程序,包中的其它非词法作用域的属性也能被访问,包括:标量、数组、hash、文件句柄。例如:
$Sum1::name;
@Sum1::arr;
每个文件都至少定义在一个包内,如果没有显式给定package指令,则这个包默认为main包。所以,访问本程序文件内自身属性的时候可以使用main:: + 属性的方式。例如在sum2.pm中:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
require '/perlapp/sum1.pm';
sub sum {
say "file: sum2,sum()";
}
sum(); # 访问本文件定义的sum子程序
main::sum(); # 等价于上一行直接访问sum()
Sum1::sum(); # 访问包Sum1::sum子程序,括号不能少
1;
一个文件内多个包
一般来说,一个文件只会定义一个包。但允许一个文件定义通过包。
如下:
package Pkg1;
...code here belong to Pkg1...
package Pkg2;
...code here belong to Pkg2...
定义多个包时,从包1到包2中间的所有属性都属于包1。
例如,在sum1.pm中:
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;
sub sum { # 位于默认的main包
say "pkg:main,sum()";
}
package Sum1; # 第一个包
sub sum { # 位于Sum1包
say "pkg:Sum1,sum()";
}
sum(); # 访问的是Sum1包的sum()
main::sum(); # 访问的是main包的sum()
package Sum2; # 第二个包
sub sum { # 位于Sum2包
say "pkg:Sum2,sum()";
}
sum(); # 访问的是Sum2包的sum()
Sum1::sum(); # 访问的是Sum1包的sum()
main::sum(); # 访问的是main包的sum()
1;
有一些词语名称总是属于main包的: ARGV、ARGVOUT、ENV、INC、SIG、STDERR、STDIN 以及 STDOUT。有些带有特殊标点符号的名称(如$_,$2, $!),它们也全部属于main。
另外,词法变量是不能使用包名访问的,因为使用包访问的属性,都是"全局"属性。所以,要在代码块中访问全局属性,可以加上包名:
package Sum1;
out $var="1234";
sub mysub {
my $var;
...$var...; # 访问的是my $var
$Sum1::var; # 访问的是Sum1包中的$var
}
如果将一个包声明放进代码块,则出了代码块的域后就消失:
package Sum1;
{
package main;
sub sum {
say "in main"
}
sum(); # 调用main中的sum
} # 退出代码块,重新回到Sum1包
sub sum {code} # 属于Sum1包的sum子程序
包代码块
从perl 5.12开始,支持包代码块:
use v5.12;
package pkg1 {
...
}
package pkg2 {
...
}
包代码块相当于词法范围:
package Navigation {
my @homeport = (21.283, -157.842); # 属于包
sub get_me_home {
my @homeport; # 声明词法变量
... @homeport ... # 访问的是词法变量
... @Navigation::homeport ... # 访问的是包变量
}
... @homeport ... # 访问的是包变量
}
它等价于:
{
package Navigation;
my @homeport = (21.283, -157.842); # 属于包
sub get_me_home {
my @homeport; # 声明词法变量
... @homeport ... # 访问的是词法变量
... @Navigation::homeport ... # 访问的是包变量
}
... @homeport ... # refers to the package variable
}
Perl包相关的更多相关文章
- GO 包相关
1 包编译,eg: 引用pkgtest包 pkgtest包没有任何编译,项目直接导入引用,项目编译时实际是会编译pkgtest并在pkg\windows_386下生成pkgtest.a文件 再编译项目 ...
- 【转载】linux-查询rpm包相关安装、卸载脚本
测试过程中,有时要测试开发自己打的rpm包,为了确认打包正确,需要查询rpm包相关安装.卸载脚本,可以使用命令: [root@6 /]#rpm -q --scripts mysql pos ...
- Perl文件句柄相关常量变量
文件句柄相关变量 对应的官方手册:http://perldoc.perl.org/perlvar.html#Variables-related-to-filehandles 默认情况下: $/:输入行 ...
- Perl包和模块(内容来自beginning perl)
单文件版的perl程序只能用于构建较小的脚本程序.当代码规模较大时,应该遵循下面两条规则来构建程序.这样能将程序的各个部分按功能一个一个地细化,便于维护,也便于后续开发. 能复用的代码放进函数 能复用 ...
- 【Android 应用开发】Android 网络编程 API笔记 - java.net 包相关 接口 api
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- R语言包相关命令
R的包(package)通常有两种:1 binary package:这种包属于即得即用型(ready-to-use),但是依赖与平台,即Win和Linux平台下不同.2 Source package ...
- Android 网络编程 API笔记 - java.net 包相关 接口 api
Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...
- rpm包相关操作
1.查找已安装的rpm:rpm -qa|grep ewp2.卸载已安装的rpm: 先切换到虚拟机共享路径,执行卸载命令: rpm -e 已安装rpm包名称3.安装新rpm包:rpm -ivh(更新的话 ...
- Linux tar包相关命令
tar [-j|-z][cv][-f 新建的文件名] filename... <==打包与压缩 tar [-j|-z][tv][-f 新建的文件名] <==查看文件名 tar [-j| ...
随机推荐
- 【慕课网实战】二、以慕课网日志分析为例 进入大数据 Spark SQL 的世界
MapReduce的局限性: 1)代码繁琐: 2)只能够支持map和reduce方法: 3)执行效率低下: 4)不适合迭代多次.交互式.流式的处理: 框架多样化: 1)批处理(离线):MapRed ...
- 排序算法(sorting algorithm) 之 选择排序(selection sort)
https://en.wikipedia.org/wiki/Selection_sort loop1: 4,6,1,3,7 -> 4,6,1,3,7 4,6,1,3,7 -> ,3,7 1 ...
- DOM对象和jQuery对象的转换
<script type="text/javascript"> //js的页面加载事件 window.onload = function () { //获取DOM对象 ...
- bzoj4445(半平面交)
列出式子对一下然后上半平面交 #include<iostream> #include<cstring> #include<cmath> #include<cs ...
- 开机后Android应用自动启动
一.需求 在应用开发过程中,有客户提出在设备开机后自动启动应用. 二.实现方法 实现方案:安卓系统每次开机的时候都会发送一个广播,监听这个广播,广播事件触发启动应用程序. 监听音频广播而不是启动广播, ...
- VSCode插件开发全攻略(九)常用API总结
更多文章请戳VSCode插件开发全攻略系列目录导航. 本文提炼一些常见的API使用场景供参考,本文内容有待完善. 编辑器相关 修改当前激活编辑器内容 替换当前编辑器全部内容: vscode.windo ...
- SQL Server 深入解析索引存储(聚集索引)
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/堆/聚集索引 概述 最近要分享一个课件就重新把这块知识整理了一遍出来,篇幅有点长,想要理解的透彻还是要上机实践. 聚 ...
- 阿里巴巴Java开发规约及插件安装
[上海尚学堂编辑整理]10.14日,阿里巴巴在杭州云栖大会上,正式发布了由阿里巴巴 P3C 项目组,经过 近一年的持续研发,正式发布众所期待的 <阿里巴巴 Java 开发规约>的扫描插件. ...
- 移动端适配方案-rem(基础篇)
常见移动web适配方案一般有3种方法,如下图: ①:定高,宽度百分比(一般用来做一些适配性不高的页面,比如主要以一些文字和图片为主的网页或移动端的头部和底部) ②:flex (更多的用于复杂页面的布局 ...
- JMH实践-代码性能测试工具
概述 JMH,即Java Microbenchmark Harness,是专门用于代码微基准测试的工具套件 JMH比较典型的应用场景有: 想准确的知道某个方法需要执行多长时间,以及执行时间和输入之间的 ...