为什么Perl模块区分大小写?

时间:2013-10-22 12:39:26

标签: perl perl-module cpan

虽然我没有看到任何具有相同名称但具有不同情况的模块,但仅仅是为了好奇,我试图安装Log::Log4perl并且在安装过程中我拼错了它'Perl'代替'perl':

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

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

% cpan -i Log::Log4perl 

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

2 个答案:

答案 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;
    }

在具有区分大小写的文件系统的系统上,如果名称不完全相同,则它甚至可能不存在。 userequire的文档中对此进行了说明。不同的案例意味着不同的名称。

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

我认为这是让Perl回归并在Frozen Perl 2011 keynote address中讨论它的主要设计决策之一。

奇怪的是,不区分大小写的文件系统可以让您远离它,就像use seems to be case INSENSITIVE!!上的Perlmonks帖子所示。