如何在@INC之外导入一个不以.pm结尾的perl模块? 背景
我正在尝试导入一个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";
.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“只是语法糖”,这不是真的。对于