如何在@INC之外导入一个不以.pm结尾的perl模块? 背景

如何在@INC之外导入一个不以.pm结尾的perl模块? 背景,perl,module,Perl,Module,我正在尝试导入一个perl模块,该模块的结尾不是.pm,方法类似于: 但是,当我尝试以这种方式导入模块时,运行时会出现以下错误: 在脚本第47行的名称处,@INC(@INC包含:……/hard/coded/目录)中找不到scripting.pm BEGIN失败--在脚本行47的名称处中止编译 问题: 如何在@INC之外导入文件末尾没有.pm的perl模块?如果源文件没有定义新的名称空间或类,而您只想从文件中读取函数定义或数据,perl提供do和require函数 do "scripting";

我正在尝试导入一个perl模块,该模块的结尾不是
.pm
,方法类似于:

但是,当我尝试以这种方式导入模块时,运行时会出现以下错误:

在脚本第47行的名称处,@INC(@INC包含:……/hard/coded/目录)中找不到scripting.pm

BEGIN失败--在脚本行47的名称处中止编译

问题:
如何在@INC之外导入文件末尾没有
.pm
的perl模块?

如果源文件没有定义新的名称空间或类,而您只想从文件中读取函数定义或数据,perl提供
do
require
函数

do "scripting";
require "scripting";
它们之间的区别在于,
require
将查找要计算为真值的文件(它期望文件中的最后一条语句解析为非零值、非空值),如果不发生这种情况,将发出致命错误。(您经常会在模块末尾看到裸
1;
语句以满足此要求)

如果
scripting
确实包含类代码,并且您确实需要
use
函数提供的所有功能,请记住

use Foo::Bar qw(stuff);
只是语法上的糖

BEGIN {
    $file = <find Foo/Bar.pm on @INC>;
    require "$file";
    Foo::Bar->import( qw(stuff) )
}
理论上,文件
scripting
可能定义其他包,并以一行开头,如
packagesomething::Else。然后,您将使用

BEGIN {
    require "scripting";
    Something::Else->import();
}

如果源文件没有定义新的名称空间或类,而您只想从文件中读取函数定义或数据,Perl将提供
do
require
函数

do "scripting";
require "scripting";
它们之间的区别在于,
require
将查找要计算为真值的文件(它期望文件中的最后一条语句解析为非零值、非空值),如果不发生这种情况,将发出致命错误。(您经常会在模块末尾看到裸
1;
语句以满足此要求)

如果
scripting
确实包含类代码,并且您确实需要
use
函数提供的所有功能,请记住

use Foo::Bar qw(stuff);
只是语法上的糖

BEGIN {
    $file = <find Foo/Bar.pm on @INC>;
    require "$file";
    Foo::Bar->import( qw(stuff) )
}
理论上,文件
scripting
可能定义其他包,并以一行开头,如
packagesomething::Else。然后,您将使用

BEGIN {
    require "scripting";
    Something::Else->import();
}

如果文件有
package
指令,则文件名和package指令需要匹配,因此只需修复文件名即可


如果文件没有
指令,则您没有,并且不应使用
使用
要求
。这可能会导致问题

你有的东西有时被称为图书馆,你应该使用它

(为了进行正确的错误检查,文件需要生成一个真值。)


也就是说,你可能正试图做一些非常糟糕的事情。我猜您要么有一个用Perl编写的配置文件,要么有一个写得不好的模块。Perl不是配置文件的合适语言选择,避免使用名称空间只是糟糕的编程,没有任何好处。

如果文件有
package
指令,则文件名和package指令需要匹配,因此只需修复文件名即可


如果文件没有
指令,则您没有,并且不应使用
使用
要求
。这可能会导致问题

你有的东西有时被称为图书馆,你应该使用它

(为了进行正确的错误检查,文件需要生成一个真值。)


也就是说,你可能正试图做一些非常糟糕的事情。我猜您要么有一个用Perl编写的配置文件,要么有一个写得不好的模块。Perl不是配置文件的合适语言选择,避免使用名称空间只是糟糕的编程,没有任何好处。

模块不会以
.pm
结尾?带有模块代码的文件名是什么?你为什么不把代码放在一个名为
the_module.pm
的文件中?@mob这是一个我没有权限接触的文件。是的,它有劣质的逻辑,但它也有一个我需要的函数,在它里面定义。它是一个名为
the_module
?@mob的文件,叫做脚本。我对它进行了更新,以减少混淆。模块不会以
.pm
结尾?带有模块代码的文件名是什么?你为什么不把代码放在一个名为
the_module.pm
的文件中?@mob这是一个我没有权限接触的文件。是的,它有劣质的逻辑,但它也有一个我需要的函数,在它里面定义。它是一个名为
the_module
?@mob的文件,叫做脚本。我对其进行了更新,以减少混淆。
do
require
之间的真正区别在于
require
仅当文件具有与文件名匹配的
声明时才应使用,这里显然不是这样。另外,如果您希望能够执行任何类型的错误检查,
do
require
都要求文件生成一个真值。Re“只是语法糖”,这不是真的。它是
BEGIN{require Foo::Bar;Foo::Bar::->import(qw(stuff));}的字面意思
并且它在两个方面与您发布的内容并不完全相同。
do
require
之间的真正区别在于
require
仅当文件具有与文件名匹配的
声明时才应使用,这里显然不是这样。另外,如果您希望能够执行任何类型的错误检查,
do
require
都要求文件生成一个真值。Re“只是语法糖”,这不是真的。对于