我是Perl
的新手。对不起,我的问题很蠢。
我有一些像这样的代码:
bintest.pl
subfolder/sample.pl
在sample.pl
中,some是这样定义的:
#!/usr/bin/perl
use lib '.';
use lib '..';
use bintest qw(:DEFAULT
$client_routine
);
然而,当我在subfolder
中使用perl sample.pl
时,我得到了这个错误:
Can't locate bintest.pm in @INC (@INC contains: .. . /etc/perl /usr/local/lib/perl/5.14.2 /usr/local/share/perl/5.14.2 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.14 /usr/share/perl/5.14 /usr/local/lib/site_perl) at sample.pl line 6.
我错过什么了吗?有人能帮帮我吗?
use做一些非常具体的事情:
完全等价于
BEGIN { require Module; Module->import( LIST ); }
require也做一些非常具体的事情:
如果EXPR是一个裸字,则要求假定为".pm"扩展并替换"::"/";在文件名中为你,使它更容易加载标准模块。
所以,当你说
use bintest ( .. );
perl
首先尝试在@INC
(现在也包含.
和..
由于您的use lib
语句)的目录之一中找到bintest.pm
。
它找不到它,因为你有bintest.pl
。
你可以require '../bintest.pl'
,然后在BEGIN
块中调用bintest->import( ... )
,但是,我假设你不想去那里。
我建议您使用不同的目录结构:
-
$project_root/bin
:你的脚本住在这里 -
$project_root/lib
:你的.pm
文件住在这里
在$project_root/lib/My/Bintest.pm
中放入以下文件
package My::Bintest;
use strict;
use warnings;
use Exporter qw( import );
1;
__END__
然后,从$project_root/bin/script.pl
中的脚本中,您可以执行:
use FindBin qw( $RealBin );
use lib "$RealBin/../lib";
use My::Bintest qw( ... );
您有两个Perl 程序称为bintest.pl
和sample.pl
。没有Perl 模块use
函数用于加载Perl模块。当use
将模块名称转换为要搜索的文件名时,它所做的一件事就是附加"。
因此,如果您有一个程序(bintest.pl
)而不是一个模块(将被称为bintest.pm
),那么use
找不到它就不足为奇了。
bintest
应该是一个模块,有人刚刚给了它错误的名字-在这种情况下,只是重命名它会工作。它可能是一个老式的Perl库——在这种情况下,用require
而不是use
加载它可能会工作得很好。但也有可能它真的是一个程序,你不应该这样使用它。
随着对代码了解的越来越多(它来自哪里,它是如何被记录的,它是什么样子的),给出一个明确的答案是不可能的。