Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 旧的.pl模块与新的.pm模块_Perl_Perl Module - Fatal编程技术网

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

Perl 旧的.pl模块与新的.pm模块,perl,perl-module,Perl,Perl Module,我是Perl的初学者,我正试图在头脑中建立构建Perl程序的最佳方法。我精通Python,并且习惯了从foo import bar导入函数和类的Python。正如我在Perl中所理解的那样,.pm和.pl模块、导出和@ISAs、use和require等有很多方法可以实现这一点,初学者很难清楚地了解每种方法的区别、优点和缺点(即使在阅读了Perl和中间Perl的开头部分之后) 问题是,我现在的问题与以下句子有关: Perl模块文件具有 分机,下午。使用操作符 假设这样,您就不必这样做了 用引号拼写

我是Perl的初学者,我正试图在头脑中建立构建Perl程序的最佳方法。我精通Python,并且习惯了从foo import bar导入函数和类的Python
。正如我在Perl中所理解的那样,.pm和.pl模块、导出和@ISAs、use和require等有很多方法可以实现这一点,初学者很难清楚地了解每种方法的区别、优点和缺点(即使在阅读了Perl和中间Perl的开头部分之后)

问题是,我现在的问题与以下句子有关:

Perl模块文件具有 分机,下午。
使用
操作符 假设这样,您就不必这样做了 用引号拼写“Module.pm”。这 也有助于区分新产品 来自旧的.pl和.ph文件的模块

在旧的.pl方法准备模块和新的.pm方法之间有哪些区别


它们真的是旧的和现代的方式吗?(我认为他们是因为帕尔莫说了这一点,但我想得到一些关于这一点的信息)

我对.pl一无所知,与其说是模块,不如说是它们在很久以前就存在了,现在似乎没有人使用它们,所以你当然也不应该使用它们

坚持使用pm模块,立即忽略@ISA,这是面向对象的。导出也不是那么重要,因为您总是可以调用完全合格的方法

因此,与其写这篇文章:

文件:MyPkg.pm

package MyPkg;
@EXPORT = qw(func1 func2);

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

sub func1 { ... };
sub func2 { ... };
文件:main.pl

#!/usr/bin/perl
use strict;
use warnings;

use MyPkg;

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

use MyPkg;

&MyPkg::func1();
首先,你应该写下:

文件:MyPkg.pm

package MyPkg;
@EXPORT = qw(func1 func2);

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

sub func1 { ... };
sub func2 { ... };
文件:main.pl

#!/usr/bin/perl
use strict;
use warnings;

use MyPkg;

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

use MyPkg;

&MyPkg::func1();
稍后,当您看到应该真正导出哪些方法时,您可以这样做,而无需更改现有代码


使用将加载您的模块并调用导入,这将使任何导出的sub在当前包中可用。在第二个示例中,require就可以了,它不调用import,但我倾向于总是使用“use”。16年前下个月发布的Perl 5中引入了
use
函数和
.pm
-类型的模块。perlmod所指的“old.pl和.ph文件”与Perl4(及更早版本)一起使用。在这一点上,他们只对计算机历史学家感兴趣。出于您的目的,只需忘记
.pl
库。

通过创建.pl文件重用代码(“pl”实际上代表“Perl库”)是在Perl 4中完成的方式—在我们有“package”关键字和“use”语句之前

这是一种令人讨厌的老办法。如果您遇到了推荐它的文档,那么这就强烈地表明您应该忽略该文档,因为它要么非常旧,要么是由超过15年没有跟上Perl开发进度的人编写的

有关以现代方式构建Perl模块的不同方法的一些示例,请参见

在旧的.pl方法准备模块和新的.pm方法之间有哪些区别

您可以在Perl自己的标准库中找到一些旧模块(由
@INC
指出,路径可以在
Perl-V
输出中看到)

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

新模块使用关键字定义自己的上下文和名称空间的名称。当被脚本调用时,新模块有可能不向脚本的直接上下文导入/添加任何内容,从而防止名称空间污染和潜在冲突

@EXPORT
/
@EXPORT\u OK
列表由标准实用程序模块
Exporter
使用,这有助于将模块函数导入调用上下文:这样就不必一直写入函数的全名。列表通常由模块根据传递给
use
的参数列表进行定制,如
use POSIX qw/:errno_h/。有关更多详细信息,请参阅


是Perl的继承机制。它告诉Perl,如果在当前包中找不到函数,则在
@ISA
中提到的所有包中扫描函数。简单模块通常只有前面提到的
导出器
使用其
导入()
方法(在相同的
perldoc Exporter
中也有很好的描述)。

重复:@Zaid:不,您链接到的问题询问普通脚本和模块之间的区别/原因。这里是关于旧式
require
-ed和新式
use
-ed模块之间的区别的问题。@Dummy,是的,正确。在写我的问题之前,我已经知道另一个问题@大家:谢谢你们的时间,非常有帮助。很遗憾,我只能选择一个问题作为最佳问题。@Zaid:看来你现在已经有足够的声誉来提交接近票数的投票了——既然你评论说这是一个骗局,你应该提交这样的投票:如果不加载Exporter,MyPkg的第一个版本将无法正常工作。“非OO”模块通常使用ISA通过Exporter定义导入例程。错误地引用奥威尔的话,“所有模块都是面向对象的,有些模块比其他模块更面向对象”。现代是“使用出口商‘进口’;”。它可以从5.8.3中获得,这也是一个旧版本,甚至可以使用Exporter和CPAN的pm升级在较旧的Perl上。具体来说,Perl 5的Sweet 16将于2010年10月17日发布。(Perl本身将在12月拥有23年的历史。)因此,您认为5.12.2团队不是“最新的Perl开发”:-,说真的,这是相当古老的信息。任何对Perl4有新认识的人现在都已经将prob转换为perl5了。