3

虽然我没有看到任何具有相同名称但具有不同情况的模块,但出于好奇,我试图安装Log::Log4perl,在安装过程中我拼错了“Perl”而不是“perl”:

% cpan -i Log::Log4Perl 
Cannot install Log::Log4Perl, don't know what it is.

当我使用正确的名称时,事情进展顺利:

% cpan -i Log::Log4perl 

相同的名称但不同的情况可能会产生冲突。这背后有什么具体原因吗?

4

2 回答 2

14

因为

use Foo::Bar;

在区分大小写的文件系统(Foo/Bar.pm?foo/bar.pm?FOO/BAR.pm?Foo/Bar.PM?等)上会模棱两可,并且需要遍历目录的内容才能找到文件名. (对于 Foo::Bar 的每个元素最多@INC需要遍历 9 个目录。)

于 2013-10-22T12:46:12.043 回答
11

在 Perl 中,加载的模块use直接翻译到文件系统中。例如use Log::Log4perl翻译成:

BEGIN {
    require 'Log/Log4perl.pm';
    Log::Log4perl->import;
    }

在具有区分大小写的文件系统的系统上,如果名称的大小写不完全相同,它甚至可能不存在。这在userequire的文档中进行了解释。不同的情况意味着不同的名称。

因此,当cpan命令将包名称转换为分发时,它使用您指定的确切大小写。文件系统可能不区分大小写,但在 Perl 中,包名仍然区分大小写。您输入的文字大小写是 Perl(和cpan客户端)使用的大小写。如果没有定义该确切情况的包,则不会发生正确的事情。

我认为这是阻碍 Perl 的主要设计决策之一,并在我的Frozen Perl 2011 主题演讲中谈到了它。

奇怪的是,不区分大小写的文件系统可以让您摆脱它,正如使用中所见似乎是不区分大小写的!Perlmonks上发帖。

于 2013-10-22T13:14:58.317 回答