【问题标题】:'Can't locate file.pl in @INC...' error in PerlPerl 中的“无法在 @INC 中找到 file.pl ...”错误
【发布时间】:2012-09-12 18:14:35
【问题描述】:

我有一个文件夹,其中包含多个通过 main.pl 运行的 .pl 文件。通过在主文件的开头使用require 'file.pl';,我已经成功地完成了这些工作。我也使用了一些模块,没有问题。

我现在正在尝试使用“自制”模块,但是当我将 use Add::Location::CSearch qw(c_search); 添加到正在使用它的文件的顶部(或主文件的顶部)并运行主文件时,它会产生Can't locate file.pl in @INC... 错误,其中file.pl 是主文件中require 列表中的第一个文件。

根据我的理解,添加use 行后,它现在尝试在同一目录中查找所有require。错误消息末尾的(@INC contains: ...) 列出了一些库/模块文件夹。当前目录的末尾还有.。

我希望我已经解释清楚了;这令人困惑!我不知道为什么会发生这种情况以及如何解决它,所以如果有任何想法,我将不胜感激。

编辑:示例代码

main.pl

#!/usr/bin/perl
package testpack;

use lib '/hlib/...';
use Add::DB;
use List::Util qw(sum);
use List::MoreUtils qw(uniq);
use List::MoreUtils qw(firstidx);
use strict;
use warnings;

require 'file1.pl';
require 'file2.pl'; 
require 'file3.pl';

.
.
.

file1.pl

#!/usr/bin/perl
package testpack;
use Add::Location::CSearch qw(c_search);

这才是问题的关键所在……其余文件都有调用子例程等的工作代码。

【问题讨论】:

  • 你的模块名称也是Add::Location::CSearch。我的意思是包装声明说什么?是package Add::Location::CSearch; 吗?还可以使用perl -V 检查您的文件夹是否在@INC 中。
  • 我查看了该模块的文档,它说要准确地写出我所做的(我没有创建模块)。我不认为我将 .pl 文件放入的文件夹需要在 \@INC 中,因为我只是在编写一个程序 - 它之前运行过而不需要在 \@INC
  • 提供包含use和require的示例代码
  • 其他人有什么想法吗? :(
  • “根据我的理解,在添加了 use 行之后,它现在尝试在同一个目录中查找所有需要”这不是真的。 useing 模块对 Perl 查找模块的位置没有影响...除非该模块操作 @INC,即 Perl 查找模块的位置列表。在错误消息中,Perl 列出了它要查找的所有目录。 file.pl 在哪里?它与您的main.pl 程序在同一目录中吗?

标签: perl module require


【解决方案1】:

没有看到你的设置我不能确定,但​​我会扔一些东西在那里。

我怀疑main.pl 和file1.pl 都在同一个目录中。 require 'file1.pl' 正在工作,因为您一直在从该目录执行 perl main.pl。 Perl 正在查找 file1.pl,因为 . 位于 @INC 中,它是查找模块的列表。

现在您正在开发一个新模块。您已将目录更改为您正在开发该模块的位置,并且您可能正在运行perl /path/to/main.pl。 Perl 无法再找到file1.pl,因为当前目录不同。

对此的典型解决方案是使用FindBin 和use lib 将您的main.pl 所在的目录放入@INC。然后无论您从哪个目录运行main.pl,它都可以在同一目录中找到其他库。

【讨论】:

  • 哦,这很有趣 - 我从同一个目录运行它,但我会尝试添加路径/目录,看看是否有效,谢谢 :)
  • 这并不能真正解释问题中描述的行为(错误取决于use Add::Location::CSearch 是否存在)。不过,你可能是对的。
  • 恐怕没有工作 - 不能说我知道为什么,因为我认为这是告诉 perl 在哪里看的一种非常明确的方式:/
  • @bladepanthera 请扩大“没用”。你尝试了什么?
  • @dan1111 use Add::Location::CSearch 是一个红鲱鱼。碰巧的是,在开发模块时,main.pl 第一次从它自己的目录之外运行。
【解决方案2】:

如果你和我一样在这里使用 Notepad++ 和 NppExec,我可能会为你提供一个很好的答案:

进入 NppExec 选项: 插件 > NppExec 点击“关注 $(CURRENT_DIRECTORY)”

问题是我确定这是我唯一更改的东西,但是当我禁用此选项时,我不再收到错误...

第一个人

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-11
    • 2012-06-23
    • 2013-05-19
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多