虽然我没有看到任何具有相同名称但具有不同情况的模块,但出于好奇,我试图安装Log::Log4perl,在安装过程中我拼错了“Perl”而不是“perl”:
% cpan -i Log::Log4Perl
Cannot install Log::Log4Perl, don't know what it is.
当我使用正确的名称时,事情进展顺利:
% cpan -i Log::Log4perl
相同的名称但不同的情况可能会产生冲突。这背后有什么具体原因吗?
虽然我没有看到任何具有相同名称但具有不同情况的模块,但出于好奇,我试图安装Log::Log4perl,在安装过程中我拼错了“Perl”而不是“perl”:
% cpan -i Log::Log4Perl
Cannot install Log::Log4Perl, don't know what it is.
当我使用正确的名称时,事情进展顺利:
% cpan -i Log::Log4perl
相同的名称但不同的情况可能会产生冲突。这背后有什么具体原因吗?
因为
use Foo::Bar;
在区分大小写的文件系统(Foo/Bar.pm?foo/bar.pm?FOO/BAR.pm?Foo/Bar.PM?等)上会模棱两可,并且需要遍历目录的内容才能找到文件名. (对于 Foo::Bar 的每个元素最多@INC
需要遍历 9 个目录。)
在 Perl 中,加载的模块use
直接翻译到文件系统中。例如use Log::Log4perl
翻译成:
BEGIN {
require 'Log/Log4perl.pm';
Log::Log4perl->import;
}
在具有区分大小写的文件系统的系统上,如果名称的大小写不完全相同,它甚至可能不存在。这在use和require的文档中进行了解释。不同的情况意味着不同的名称。
因此,当cpan
命令将包名称转换为分发时,它使用您指定的确切大小写。文件系统可能不区分大小写,但在 Perl 中,包名仍然区分大小写。您输入的文字大小写是 Perl(和cpan
客户端)使用的大小写。如果没有定义该确切情况的包,则不会发生正确的事情。
我认为这是阻碍 Perl 的主要设计决策之一,并在我的Frozen Perl 2011 主题演讲中谈到了它。
奇怪的是,不区分大小写的文件系统可以让您摆脱它,正如使用中所见似乎是不区分大小写的!在Perlmonks上发帖。