【问题标题】:Why are Perl modules case sensitive?为什么 Perl 模块区分大小写?
【发布时间】:2013-10-31 08:08:37
【问题描述】:

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

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

当我使用正确的名称时,一切顺利:

% cpan -i Log::Log4perl 

名称相同但大小写不同会产生冲突。这背后有什么具体原因吗?

【问题讨论】:

  • perldoc 并没有太多允许,而是询问文件系统是否存在名称。

标签: perl perl-module cpan


【解决方案1】:

因为

use Foo::Bar;

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

【讨论】:

    【解决方案2】:

    在 Perl 中,使用 use 加载的模块直接转换到文件系统上。诸如use Log::Log4perl 之类的内容会转化为:

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

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

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

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

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

    【讨论】:

    • 奇怪的是,在 Windows(其中一个不区分大小写的系统)上,您可以在不触发致命错误的情况下执行 use data::dumper,但它不会加载函数。例如。 perl -lwe"use data::dumper; print Dumper undef" // Name "main::Dumper" used only once: possible typo at -e line 1. // print() on unopened filehandle Dumper at -e line 1.
    • @TLP,因为它尝试从 data::dumper 导入,它没有 import 方法。
    • @ikegami 我的意思是,尝试use 带有错误字母的模块会导致致命错误。使用错误的大小写不会,但它不会导入模块方法。
    • @TLP,啊,听起来像是一个问题(“Curiously”)。
    • @ikegami 我的问题可能是它如何在没有实际执行的情况下加载模块,以及为什么这不是错误。
    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 2011-11-14
    相关资源
    最近更新 更多