导入/要求/使用 Perl 模块

问题描述 投票:0回答:3

我有 2 个 perl 文件,它们相互依赖。 第一个文件 A 是一个 .pl 文件,其中声明了多个包/模块。 第二个文件 B 将尝试访问文件 A 中声明的众多包之一。这是如何做到的?

perl import module package require
3个回答
2
投票

您可能熟悉 Java 或类似语言如何通过在类路径中查找

import com.example.AppName
文件来找到
com/example/AppName.java
命名空间。当您向 Perl 询问
use HTML::Template
时,它同样会在
HTML/Template.pm
列出的目录中查找
@INC

不同的是,一个Perl文件可以有多个包。当您说

use HTML::Template
时,您将拉入
HTML/Template.pm
中列出的所有软件包(
use
会自动将
::
转换为适合您系统的正确目录分隔符,并添加
.pm
)。如果该文件中恰好有一个
HTML::Template::Extension
包,那么您可以使用该包而无需显式
use
它。它已经加载了完整的文件,这就足够了。

如果您知道与运行脚本的位置相关的确切文件名,则获取它的最简单方法是:

require 'path/to/file.pl';

0
投票

perl

@INC
和 Java
classpath
之间的比较是我弄清楚如何使用 Perl 文件作为本地 Perl 模块的关键。虽然 require 在问题场景中更实用,但在阅读@frezik 答案后,我将注册如何通过导入模块(使用关键字)来实现相同的目标。

必须检查 @INC 数组才能知道我们可以在哪里放置依赖项,这可以使用单行 Perl::

来完成
perl -e 'print $_ . "\n" for (@INC);'

对于不使用系统范围安装的我来说,检查是有意义的,上面命令的输出对我来说是这样的:

/home/<my-username>/.asdf/installs/perl/5.38.2/lib/site_perl/5.38.2/x86_64-linux
/home/<my-username>/.asdf/installs/perl/5.38.2/lib/site_perl/5.38.2
/home/<my-username>/.asdf/installs/perl/5.38.2/lib/5.38.2/x86_64-linux
/home/<my-username>/.asdf/installs/perl/5.38.2/lib/5.38.2

Linux 操作系统包管理器进行的系统范围安装可能会指向一些更常见的路径,例如

/usr/lib/perl5/...

我为我的环境目录选择了一些看起来更通用的目录,即使这是一个简单的测试来了解这些可能性:

/home/<my-username>/.asdf/installs/perl/5.38.2/lib/5.38.2

在此路径中,我创建了表示属于

Hello
包的
Basic::HelloWorld
模块的结构文件,从而在上述目录内的相对路径
Hello.pm
中生成了
Basic/HelloWord
文件。

Hello.pm
文件:

#!/usr/bin/env perl

package Basic::HelloWorld

print "Hello, World.\n";

这样,我的 Perl 环境的 @INC 数组中的某个目录就有这个模块,因为文件位于这个绝对路径中:

/home/<my-username>/.asdf/installs/perl/5.38.2/lib/5.38.2/Basic/HelloWord/Hello.pm

应该使用此模块的文件现在可以引用此依赖项,如下所示:

文件

app.pl
,位于某处,因为它使用了您放置本地模块的 Perl 安装:

#!/usr/bin/env perl

use Basic::HelloWorld::Hello

由于这两个文件对于要执行的用户都有执行权限,因此您可以执行

app.pl
文件:

./app.pl

perl app.pl

遗嘱将产生以下输出:

Hello, World.

由于

app.pl
除了使用
Hello
模块、
Hello.pm
文件之外没有做任何事情,因此输出是由于Hello模块中的打印功能生成的。


-2
投票

您需要在每个使用模块函数的 pl 文件中声明一个模块。

© www.soinside.com 2019 - 2024. All rights reserved.