虽然我没有看到任何具有相同名称但具有不同情况的模块,但仅仅是为了好奇,我试图安装Log::Log4perl并且在安装过程中我拼错了它'Perl'代替'perl':
% cpan -i Log::Log4Perl
Cannot install Log::Log4Perl, don't know what it is.
当我使用正确的名字时,情况进展顺利:
% cpan -i Log::Log4perl
名称相同但不同的案例可能会产生冲突。这背后有什么具体原因吗?
答案 0 :(得分:14)
由于
use Foo::Bar;
对于区分大小写的文件系统(Foo / Bar.pm?foo / bar.pm?FOO / BAR.pm?Foo / Bar.PM?等)会不明确,并且需要遍历目录的内容才能找到文件的名称。 (每个元素@INC
最多需要9个目录才能遍历Foo :: Bar。)
答案 1 :(得分:11)
在Perl中,加载了use
的模块直接转换到文件系统。诸如use Log::Log4perl
之类的东西转化为:
BEGIN {
require 'Log/Log4perl.pm';
Log::Log4perl->import;
}
在具有区分大小写的文件系统的系统上,如果名称不完全相同,则它甚至可能不存在。 use和require的文档中对此进行了说明。不同的案例意味着不同的名称。
因此,当cpan
命令将包名称转换为分发时,它将使用您指定的确切大小写。文件系统可能不区分大小写,但在Perl中,包名称仍然区分大小写。您输入的文字案例是Perl(和cpan
客户端)使用的案例。如果没有定义那个确切案例的包,那么正确的事情就不会发生。
我认为这是让Perl回归并在Frozen Perl 2011 keynote address中讨论它的主要设计决策之一。
奇怪的是,不区分大小写的文件系统可以让您远离它,就像use seems to be case INSENSITIVE!!上的Perlmonks帖子所示。