模块
模块是一个.pm文件,可以在其他Perl文件(脚本或者模块)中引用。模块是一个文本文件,和perl脚本.pl的语法一模一样。模块的例子可以参考C:\foo\bar\baz\Demo\StringUtils.pm或者/foo/bar/baz/Demo/StringUtils.pm,代码如下:
- use strict;
- use warnings;
- sub zombify {
- my $word = shift @_;
- $word =~ s/[aeiou]/r/g;
- return $word;
- }
- return 1;
因为当一个模块被载入时,模块是从头到尾的执行,你需要在末尾返回一个true值,表示这个模块已经载入成功。
为了让Perl解释器可以找到它们,在调用perl之前,包含perl模块的目录必须在环境变量PERL5LIB中列明。列出包含模块的根目录,而不要列出模块所在目录或者模块本身:
- set PERL5LIB=C:\foo\bar\baz;%PERL5LIB%
或者
- export PERL5LIB=/foo/bar/baz:$PERL5LIB
一旦Perl模块被创建,perl就会知道哪里才能找到它们,你可以在perl脚本中使用require函数搜索并执行它。例如,调用require Demo::StringUtils会触发Perl解释器在PERL5LIB的目录中逐一搜索,查找名为Demo/StringUtils.pm的文件。模块被执行完后,模块中定义的子程序现在对于主脚本来说就是可调用的了。我们的例子中可能叫做main.pl,并且代码如下:
- use strict;
- use warnings;
- require Demo::StringUtils;
- print zombify("i want brains"); # "r wrnt brrrns"
注意,使用双冒号隔开目录和模块。
现在出现一个问题:如果main.pl包含很多require语句,并且每个模块包含很多require,那么我们就很难去追踪原始的zombify定义到底是在哪里。解决方法就是使用包。