93

.pm(Perl 模块)和.pl(Perl 脚本)文件有什么区别?

还请告诉我为什么我们1从文件中返回。如果返回 2 或其他任何值,它不会产生任何错误,那么我们为什么1要从 Perl 模块返回呢?

4

2 回答 2

81

从本质上讲,您使用的文件扩展名对于如何perl解释这些文件没有任何影响。

但是,将模块放在.pm遵循包名称的特定目录结构的文件中提供了便利。因此,如果您有一个模块Example::Plot::FourD并将其Example/Plot/FourD.pm放在.@INCuserequireuse Example::Plot::FourD

该文件必须返回 true 作为最后一条语句,以指示任何初始化代码的成功执行,因此习惯上以结束此类文件,1; 除非您确定它会返回 true 否则。但最好只放1;, 以防您添加更多语句。

如果EXPR是一个裸词,则require假定为“.pm”扩展名并为您将文件名中的“::”替换为“/”,以便于加载标准模块。这种形式的模块加载不会改变您的命名空间。

所做的只是从提供use的包名中找出文件名,将require其放在一个BEGIN块中并在包上调用import。没有什么可以阻止您不使用use但手动执行这些步骤。

例如,下面我将Example::Plot::FourD包放在一个名为 的文件中t.pl,将其加载到文件中的脚本中s.pl

C:\Temp> cat t.pl
package Example::Plot::FourD;

use strict; use warnings;

sub new { bless {} => shift }

sub something { print "something\n" }

"Example::Plot::FourD"

C:\Temp> cat s.pl
#!/usr/bin/perl
use strict; use warnings;

BEGIN {
    require 't.pl';
}

my $p = Example::Plot::FourD->new;
$p->something;


C:\Temp> s
something

这个例子表明模块文件不必以 结尾1,任何真值都可以。

于 2010-08-04T12:41:09.447 回答
-2

.pl 是单个脚本。

在 .pm ( Perl Module ) 中,您可以使用其他 Perl 脚本中的函数:

Perl 模块是一段独立的 Perl 代码,可由 Perl 程序或其他 Perl 模块使用。它在概念上类似于 C 链接库或 C++ 类。

于 2010-08-04T05:25:36.917 回答