我是Perl
的新手。对不起我的愚蠢问题。
我有一些像这样的代码:
bintest.pl
subfolder/sample.pl
在sample.pl
中,有些定义如下:
#!/usr/bin/perl
use lib '.';
use lib '..';
use bintest qw(:DEFAULT
$client_routine
);
但是,当我在perl sample.pl
中使用subfolder
时,我收到了此错误:
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.
我错过了什么吗?有人能给我一些帮助吗?
答案 0 :(得分:7)
use做了一些非常具体的事情:
完全等同于
BEGIN { require Module; Module->import( LIST ); }
require也做了一些非常具体的事情:
如果EXPR是一个单词,则需要假设" .pm"扩展并替换" ::"用" /"在您的文件名中,以便加载标准模块。
所以,当你说
时use bintest ( .. );
perl
首先尝试在bintest.pm
的一个目录中找到@INC
(现在还包含.
和..
,这要感谢您的{{1}语句)。
它无法找到它,因为你拥有的是use lib
。
你可以bintest.pl
,然后在require '../bintest.pl'
区域中自己调用bintest->import( ... )
,但是,我假设你不想去那里。
我建议您使用不同的目录结构:
BEGIN
:您的脚本就在这里$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
答案 1 :(得分:1)
您有两个名为bintest.pl
和sample.pl
的Perl 计划。您没有Perl 模块。函数use
用于加载Perl模块。当use
将模块名称转换为要搜索的文件名时,它所做的一件事就是追加" .pm"这个名字。
所以假设你有一个程序(bintest.pl
)而不是一个模块(称为bintest.pm
),那么use
可以&#就不足为奇了39;找不到。
当然,真正的问题是,您可以采取哪些措施来解决这个问题?没有更多信息,这很难回答。可能bintest
应该是一个模块而某人刚刚给它一个错误的名字 - 在这种情况下只需重命名它就行了。它可能是一个旧式的Perl库 - 在这种情况下,使用require
而不是use
加载它可能会很有效。但同样可能的是,它确实是一个程序,你不应该试图以这种方式使用它。
了解更多关于代码的信息(它来自哪里,如何记录,看起来像什么),无法给出明确的答案。