Perl 的包加载机制

Perl 中有两个方法加载包: userequire

1 use warnings;
2 require warnings;

use 和 require 的区别

use 只能加载模块

use warnings; 会在 @INC 目录下寻找文件名为 warnings.pm 的模块,并加载它。

require 可以加载模块和文件

1 # 可以用字符串明确表示文件名
2 require 'strict.pm';
3 
4 # 等价于 require 'warnings.pm';
5 require warnings;
6 
7 # 也可以用来执行文件
8 require 'export.pl';

包加载时的行为不一样

1 use warnings;
2 
3 # 实际上等价于
4 
5 BEGIN {
6     require warnings;
7     warnings->import();
8 }

可以验证一下

Enum.pm

 1 package Enum;
 2 
 3 use 5.014;
 4 use warnings;
 5 
 6 sub import {
 7     # 获取这个子例程的调用信息
 8     say for caller;
 9 
10     say join ' ', @_;
11 }
12 
13 1;

然后在 main.pl 中使用这个包.

 1 #!/usr/bin/env perl
 2 
 3 use Enum qw/arg1 arg2 arg3/;
 4 
 5 # 上面输出结果将是
 6 
 7 # 使用这个包的包名 使用这个包的文件名 使用这个包的行序号
 8 main main.pl 3
 9 # 使用的这个包包名 使用这个包时传递的参数列表
10 Enum arg1 arg2 arg3

应用

利用这个 import 子例程还可以做一些其它的事情。

比如使用 use base qw/Base1 Base2/ 继承, base 包的 import 子例程就可以简单写成

1 package base;
2 
3 sub import {
4     my $package = caller(0);
5     my $self    = shift;
6 
7     push @ISA, $_ for @_;
8 }

当然,标准库里还复制了父包的每一个属性,而这里只是简单的添加到 @ISA 列表。

本文作者: zhustec

本文标题: Perl 的包加载机制

本文链接: https://blog.zhustec.me/posts/package-loading-mechanism-in-perl

发布时间: 2015-01-13T07:55:10+00:00

版权声明: 本文由 zhustec 原创 采用 CC BY-NC-ND 4.0 许可协议 转载请保留以上声明信息!