代码之家  ›  专栏  ›  技术社区  ›  joaquin

旧的.pl模块与新的.pm模块

  •  4
  • joaquin  · 技术社区  · 14 年前

    我是一个Perl初学者,我正在尝试在头脑中构建构建Perl程序的最佳方法。我精通巨蟒,习惯了巨蟒 from foo import bar 从Python模块导入函数和类的方式。正如我在Perl中理解的那样,有很多方法可以做到这一点,.pm和.pl模块、exports和@is as、use和require等等,初学者很难清楚地知道它们的区别、优点和缺点(即使在阅读了开始的Perl和中间的Perl之后)。

    问题是,我现在的问题与一个句子有关 perldoc perlmod :

    Perl模块文件具有 延期.pm.这个 use 操作人员 假设这样你就不必 用引号拼出“module.pm”。这个 也有助于区分新的 来自旧.pl和.ph文件的模块。

    两者的区别是什么 古老的 .pl准备模块的方法和 新的 下午好吗?

    他们真的是 古老的 以及 现代的 方式?(我认为是因为Perlmod这么说,但我想得到一些关于这个的信息)。

    4 回复  |  直到 14 年前
        1
  •  4
  •   Dummy00001    14 年前

    旧的.pl方式和新的.pm方式有什么区别?

    您可以在Perl自己的标准库中找到几个旧模块(由 @INC ,路径可以在 perl -V 输出)。

    在旧时代,没有包裹。一个在做例如 require "open2.pl"; 类似于在调用脚本中包含文件的内容。所有函数都已声明,所有全局变量都成为脚本上下文的一部分。或者换句话说:污染你的环境。包含几个文件可能会导致所有可能的冲突。

    新模块使用 package 关键字定义自己的上下文和命名空间名称。什么时候? use -通过脚本,新模块可以不导入/添加任何内容到脚本的即时上下文,从而防止命名空间污染和潜在冲突。

    @EXPORT / @EXPORT_OK 列表由标准实用程序模块使用 Exporter 这有助于将模块函数导入到调用上下文中:这样就不必一直写函数的全名。这些列表通常由模块根据传递给 使用 就像在 use POSIX qw/:errno_h/; . 见 perldoc Exporter 了解更多详细信息。

    @ISA 是Perl的继承机制。它告诉Perl,如果在当前包中找不到函数,则扫描中提到的所有包中的函数。 “伊萨” . 简单的模块通常只有 出口商 提到使用它 import() 方法 Perldoc导出器 )

        2
  •  8
  •   cjm    14 年前

    这个 use 功能和 .pm -类型模块是在16年前下个月发布的Perl5中引入的。perlmod所指的“old.pl和.ph文件”与perl 4(及更早版本)一起使用。在这一点上,他们只对计算机历史学家感兴趣。为了你的目的,忘了 .pl 图书馆。

        3
  •  3
  •   Community CDub    8 年前

    通过创建.pl文件来重用代码(“pl”实际上代表“perl库”)是在Perl4中完成的方法,在我们拥有“package”关键字和“use”语句之前。

    这是一种讨厌的老方法。如果您遇到的是推荐它的文档,那么这就强烈地表明您应该忽略该文档,因为它可能很旧,或者是由一个超过15年没有跟上Perl开发的人编写的。

    有关以现代方式构建Perl模块的不同方法的一些示例,请参见 my answer to Perl Module Method Calls: Can't call method “X” on an undefined value at ${SOMEFILE} line ${SOMELINE}

        4
  •  1
  •   tex    14 年前

    我对.pl一无所知,与其说模块早就存在,不如说现在似乎没有人使用它们,所以你也不应该使用它们。

    坚持PM模块,现在忽略@isa,这是面向OOP的。导出也不那么重要,因为您总是可以调用完全合格的方法。

    所以,与其写这些:

    文件:mypkg.pm

    package MyPkg;
    @EXPORT = qw(func1 func2);
    
    sub func1 { ... };
    sub func2 { ... };
    

    文件:main.pl

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    use MyPkg;
    
    &func1();
    

    首先,你应该写下:

    文件:mypkg.pm

    package MyPkg;
    
    sub func1 { ... };
    sub func2 { ... };
    

    文件:main.pl

    #!/usr/bin/perl
    use strict;
    use warnings;
    
    use MyPkg;
    
    &MyPkg::func1();
    

    稍后,当您看到应该真正导出哪些方法时,您可以这样做,而不必更改现有的代码。

    使用将加载您的模块并调用import,这将使当前包中任何导出的子文件都可用。在第二个例子中,一个require可以做到,它不调用import,但我倾向于总是使用'use'。