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

0dxa2lsx  于 2023-04-06  发布在  Perl
关注(0)|答案(2)|浏览(277)

.pm(Perl模块)和.pl(Perl脚本)文件有什么区别?
请告诉我为什么我们从文件返回1。如果返回2或其他任何东西,它不会产生任何错误,那么为什么我们从Perl模块返回1

ltskdhd1

ltskdhd11#

从根本上说,您使用的文件扩展名对perl如何解释这些文件没有任何影响。
但是,将模块放在.pm文件中,按照包名后面的特定目录结构可以提供方便。因此,如果您有一个模块Example::Plot::FourD,并将其放在@INC路径中的Example/Plot/FourD.pm目录中,那么当给定use Example::Plot::FourD中的包名时,userequire将做正确的事情。
文件的最后一条语句必须返回true,以表示任何初始化代码的成功执行,因此习惯上以1;结束这样的文件,除非你确定它会返回true。但是最好只放1;,以防你添加更多的语句。
如果EXPR是一个bareword,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结尾,任何true值都可以。

kmpatx3s

kmpatx3s2#

.pl是一个脚本。
.pmPerl Module)中,您可以从其他Perl脚本中使用函数:
Perl模块是一段自包含的Perl代码,可以被Perl程序或其他Perl模块使用。它在概念上类似于C链接库或C++类。

相关问题