模块

模块是一个.pm文件,可以在其他Perl文件(脚本或者模块)中引用。模块是一个文本文件,和perl脚本.pl的语法一模一样。模块的例子可以参考C:\foo\bar\baz\Demo\StringUtils.pm或者/foo/bar/baz/Demo/StringUtils.pm,代码如下:

 
  
  1. use strict;  
  2. use warnings;  
  3.  
  4. sub zombify {  
  5.     my $word = shift @_;  
  6.     $word =~ s/[aeiou]/r/g;  
  7.     return $word;  
  8. }  
  9.  
  10. return 1; 

因为当一个模块被载入时,模块是从头到尾的执行,你需要在末尾返回一个true值,表示这个模块已经载入成功。

为了让Perl解释器可以找到它们,在调用perl之前,包含perl模块的目录必须在环境变量PERL5LIB中列明。列出包含模块的根目录,而不要列出模块所在目录或者模块本身:

 
  
  1. set PERL5LIB=C:\foo\bar\baz;%PERL5LIB%  

或者

 
  
  1. export PERL5LIB=/foo/bar/baz:$PERL5LIB 

一旦Perl模块被创建,perl就会知道哪里才能找到它们,你可以在perl脚本中使用require函数搜索并执行它。例如,调用require Demo::StringUtils会触发Perl解释器在PERL5LIB的目录中逐一搜索,查找名为Demo/StringUtils.pm的文件。模块被执行完后,模块中定义的子程序现在对于主脚本来说就是可调用的了。我们的例子中可能叫做main.pl,并且代码如下:

 
  
  1. use strict;  
  2. use warnings;  
  3.  
  4. require Demo::StringUtils;  
  5.  
  6. print zombify("i want brains"); # "r wrnt brrrns" 

注意,使用双冒号隔开目录和模块。

现在出现一个问题:如果main.pl包含很多require语句,并且每个模块包含很多require,那么我们就很难去追踪原始的zombify定义到底是在哪里。解决方法就是使用包。