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


88

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

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


11
1没关系。它可以是2,也可以是"foo",也可以是["a", "list"]。重要的是不是0,或者其他任何评估为假的或use将失败的东西。
阿玛丹

.pl实际上是一个perl库-perl脚本(例如C程序或用其他语言编写的程序)没有结尾,除非在需要使用功能的操作系统(例如Windows)上。
记得莫妮卡

Answers:


78

从根本上讲,您使用的文件扩展名对于perl解释这些文件的方式没有影响。

但是,将模块放在.pm遵循包名称的特定目录结构的文件中会带来便利。因此,如果您有一个模块,Example::Plot::FourD并且将其放在Example/Plot/FourD.pm路径中的目录中@INC,那么在给定包名称(如)时userequire它将做正确的事情use Example::Plot::FourD

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

如果EXPR为准字,则require假设扩展名为“ .pm”,并用文件名中的“ /”替换“ ::”,以便轻松加载标准模块。这种形式的模块加载不会冒更改您的名称空间的风险。

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

例如,下面我将Example::Plot::FourD包放在一个名为的文件中t.pl,然后将其加载到file的脚本中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,任何true值都可以。


-2

.pl是单个脚本。

在.pm(Perl模块)中,您具有可以从其他Perl脚本中使用的功能:

Perl模块是Perl代码的一部分,可以由Perl程序或其他Perl模块使用。从概念上讲,它类似于C链接库或C ++类。


5
“ .pl是单个脚本。” 不对。仅在损坏的操作系统上,才需要标识扩展名为.pl的Perl程序。最初,.pl表示“ Perl库”-使用“ require”或“ do”命令加载的外部子例程。
戴夫·克罗斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.