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

use*_*979 84 perl perl-module

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

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

Sin*_*nür 74

在核心,您使用的文件扩展名对于如何perl解释这些文件没有任何区别.

但是,将模块放在.pm文件后面的包名称后面的某个目录结构中可以提供方便.所以,如果你有一个模块Example::Plot::FourD并将它放在你Example/Plot/FourD.pm的路径中的一个目录中@INC,那么当给出包名时use,它require会做正确的事情use 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
Run Code Online (Sandbox Code Playgroud)

此示例显示模块文件不必结束1,任何真值都可以.


Igo*_*Oks -4

A.pl是单个脚本。

.pmPerl 模块)中,您可以使用其他 Perl 脚本中的函数:

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

  • “.pl 是单个脚本。” 不对。只有在损坏的操作系统上,您才需要识别具有 .pl 扩展名的 Perl 程序。最初 .pl 表示“Perl 库”——使用“require”或“do”命令加载的外部子例程。 (7认同)