【问题标题】:In Perl, what is the difference between a .pm (Perl module) and .pl (Perl script) file?在 Perl 中,.pm(Perl 模块)和 .pl(Perl 脚本)文件有什么区别?
【发布时间】:2011-03-25 02:06:35
【问题描述】:

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

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

【问题讨论】:

  • 1 没关系。可以是2,可以是"foo",也可以是["a", "list"]。重要的是它不是0,或者任何其他评估为假的东西,或者use 会失败。
  • .pl 实际上是一个 perl 库 - perl 脚本,就像 C 程序或用其他语言编写的程序一样,没有结尾,除了在需要一个功能的操作系统上,例如 windows。

标签: perl perl-module


【解决方案1】:

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

但是,将模块放在.pm 文件中,遵循包名之后的某个目录结构,这样会很方便。所以,如果你有一个模块Example::Plot::FourD,并且你把它放在@INC的路径中的目录Example/Plot/FourD.pm中,那么userequire将在给定包名时做正确的事情,如@ 987654331@.

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

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

use 所做的只是从提供的包名中找出文件名,requireBEGIN 块中并在包上调用 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结尾,任何真值都可以。

【讨论】:

    【解决方案2】:

    .pl 是一个单一的脚本。

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

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

    【讨论】:

    • "一个 .pl 是一个单一的脚本。"不对。只有在损坏的操作系统上,您才需要识别带有 .pl 扩展名的 Perl 程序。最初 .pl 表示一个“Perl 库”——您使用“require”或“do”命令加载的外部子例程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2021-02-13
    • 2020-10-15
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多