在 INC 中找不到 *.pm

  • 本文关键字:pm 找不到 INC perl
  • 更新时间 :
  • 英文 :


我是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.plsample.pl。没有Perl 模块use函数用于加载Perl模块。当use将模块名称转换为要搜索的文件名时,它所做的一件事就是附加"。

因此,如果您有一个程序(bintest.pl)而不是一个模块(将被称为bintest.pm),那么use找不到它就不足为奇了。

当然,真正的问题是,你能做些什么来解决这个问题?如果没有更多的信息,这个问题很难回答。这是可能的,bintest应该是一个模块,有人刚刚给了它错误的名字-在这种情况下,只是重命名它会工作。它可能是一个老式的Perl库——在这种情况下,用require而不是use加载它可能会工作得很好。但也有可能它真的是一个程序,你不应该这样使用它。

随着对代码了解的越来越多(它来自哪里,它是如何被记录的,它是什么样子的),给出一个明确的答案是不可能的。

最新更新