无法在INC

时间:2015-08-21 15:15:40

标签: perl

我是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.

我错过了什么吗?有人能给我一些帮助吗?

2 个答案:

答案 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.plsample.pl的Perl 计划。您没有Perl 模块。函数use用于加载Perl模块。当use将模块名称转换为要搜索的文件名时,它所做的一件事就是追加" .pm"这个名字。

所以假设你有一个程序(bintest.pl)而不是一个模块(称为bintest.pm),那么use可以&#就不足为奇了39;找不到。

当然,真正的问题是,您可以采取哪些措施来解决这个问题?没有更多信息,这很难回答。可能bintest应该是一个模块而某人刚刚给它一个错误的名字 - 在这种情况下只需重命名它就行了。它可能是一个旧式的Perl库 - 在这种情况下,使用require而不是use加载它可能会很有效。但同样可能的是,它确实是一个程序,你不应该试图以这种方式使用它。

了解更多关于代码的信息(它来自哪里,如何记录,看起来像什么),无法给出明确的答案。