相对于脚本添加Perl模块

时间:2012-02-15 09:56:55

标签: perl module relative

我试图将模块File-Copy-Recursive添加到我的脚本中,因为我已经使用了另一个模块,但是当我尝试使用它时,我得到一个我无法解释的错误:

use lib "./cpan";
use Recursive qw(dircopy);
dircopy($path1, $path2);

我得到的错误是:未定义的子程序& main :: dircopy在...处调用

我不明白,模块里面明显有dircopy功能。

3 个答案:

答案 0 :(得分:4)

正如其他答案已经说明的那样,这是行不通的,因为您已将模块在include目录中的位置从File/Copy/Recursive.pm移到Recursive.pm

这是为什么不起作用:

Perl 模块(具有.pm扩展名的文件)和Perl (特定命名空间下的代码集合)是两个完全不同的东西。通常情况下,我们会将一个软件包放入一个恰好具有相同名称的模块中,但这只是为了帮助我们人类保持理智。 perl不关心这种方式 - 一个模块可以包含多个包,一个包可以拆分多个文件,包和名称模块可以完全不相关所有{{1}关心。

但是,仍然......对于两者都使用相同名称的约定,perl命令利用它来使事情变得更方便。在幕后,use表示use Module; - 请注意,它会调用模块名称上的导入,而不是模块中包含的包的名称!

这是你问题的关键。即使您已将文件移出require Module.pm; Module->import;目录,其内容仍指定File/Copy/,因此它的所有代码都会结束。 package File::Copy::Recursive尝试调用不存在的use Recursive,因此不会导入任何内容。 Recursive->import函数将由dircopy导入,但永远不会被调用。

所以,是的。将File::Copy::Recursive->import移至./cpan/Recursive.pm,以便包名称和模块名称将再次匹配,并恢复健全性。 (如果你一直在关注,你应该能够提出至少两到三种其他方法来实现这一点,但如果你将文件移到./cpan/File/Copy/Recursive.pm下的适当位置真的是你最好的选择需要将./cpan源保存在项目代码的子目录中。)

答案 1 :(得分:2)

将FindBin用于相对lib路径:

use FindBin;
use lib "$FindBin::Bin/./cpan";
use File::Copy::Recursive;

你必须将整个“树”保持在./cpan之下,使用线必须保持不变。

./cpan目录下的文件:

 find ./cpan/
 ./cpan/File/Copy/Recursive.pm

答案 2 :(得分:1)

Perl中的模块名称不仅来自路径,还来自其package声明。您已将模块安装到./cpan,但指定的包名称仍为File::Copy::Recursive