.pm
(Perl模块)和.pl
(Perl脚本)文件之间有什么区别?
还请告诉我为什么我们1
从文件中返回。如果返回2或其他任何内容,它不会产生任何错误,那么为什么我们1
要从Perl模块返回?
Answers:
从根本上讲,您使用的文件扩展名对于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
,然后将其加载到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值都可以。
1
没关系。它可以是2
,也可以是"foo"
,也可以是["a", "list"]
。重要的是不是0
,或者其他任何评估为假的或use
将失败的东西。