我在脚本的父目录中有一个模块,我想要“使用”它。
如果我这样做:
use '../Foo.pm';
我遇到了语法错误。
我尝试执行:
push @INC, '..';
use EPMS;
而且..显然没有出现在@INC中。
我快疯了!这里出了什么问题?
我在脚本的父目录中有一个模块,我想要“使用”它。
如果我这样做:
use '../Foo.pm';
我遇到了语法错误。
我尝试执行:
push @INC, '..';
use EPMS;
而且..显然没有出现在@INC中。
我快疯了!这里出了什么问题?
use
在编译时发生作用,因此这将起作用:
BEGIN {push @INC, '..'}
use EPMS;
但更好的解决方案是使用use lib
,这是一种更好的编写上述内容的方式:
use lib '..';
use EPMS;
如果您的脚本位于不同的目录中运行,建议使用FindBin
:
use FindBin; # locate this script
use lib "$FindBin::RealBin/.."; # use the parent directory
use EPMS;
就个人而言,我更喜欢将我自己编写的模块(或者是我可以控制的系统所需的模块)放在特定的目录中,并将它们放在一个子目录中。例如:
/www/modules/MyMods/Foo.pm
/www/modules/MyMods/Bar.pm
然后我在哪里使用它们:
use lib qw(/www/modules);
use MyMods::Foo;
use MyMods::Bar;
顺便说一下,当涉及到“推动”时,我更喜欢使用“fat-arrow”逗号:
push @array => $pushee;
但那只是个人偏好的问题。
perldoc perlop
的说明: “=>
运算符是逗号的同义词,但如果它左边的单词以字母或下划线开头,并且仅由字母、数字和下划线组成,则会将其解释为字符串。[...] 否则,根据上下文,=>
运算符的行为与逗号运算符或列表参数分隔符完全相同。” =>
也被称为“胖逗号”。 - ThisSuitIsBlackNot<=
不适用于此。 - Steven Lu在使用前必须先处理push
,并且尽早处理use
。因此,我认为您需要一个BEGIN { push @INC, ".."; }
来有机会实现。
据“perldoc -f use”报道:
它与以下代码完全等效:
BEGIN { require Module; import Module LIST; }
不同的是,Module必须是一个裸字。
换句话说,“use”等同于:
require
该文件名,并import
该包。因此,您可以在BEGIN块内调用require和import而不是调用use:
BEGIN {
require '../EPMS.pm';
EPMS->import();
}
BEGIN {
require '../EPMS.pm';
}
它无法工作的原因是您添加到@INC
的内容是相对于命令行中的当前工作目录,而不是脚本目录。
例如,如果您当前在:
a/b/
你正在运行的脚本具有以下URL:
a/b/modules/tests/test1.pl
BEGIN {
unshift(@INC, "..");
}
..
将导致目录a/
而不是a/b/modules
。..
改为./modules
,要么在再次运行脚本之前在命令行中执行cd modules/tests
。一些集成开发环境(IDE)无法正确处理“use lib”这个首选答案。我发现“use lib::relative”可以在我的IDE,JetBrains的WebStorm中使用。
use lib
的转换也不完全相同。但我想展示从问题到使其工作所需的最小可用更改。谢谢你注意到了 :) - ephemient