代码之家  ›  专栏  ›  技术社区  ›  Stephen

默认情况下,Perl不包括@INC中的当前目录吗?

  •  27
  • Stephen  · 技术社区  · 8 年前

    我从来没有完全理解Perl对包名的解析,但我一直认为,假设您正在执行myscript,那么下面的内容应该始终有效。pl从包含它的目录中:

    myscript.pl (contains the following statement: use Class1::Class2::Class3)
    Class1/
        Class2/
            Class3.pm (contains the following package declaration: package Class1::Class2::Class3;)
    

    然而,这在我的代码中不起作用,因为类3。无法找到pm。看看@INC,它不包括当前目录,只包括我的草莓Perl安装的各个目录。

    解决这个问题的推荐方法是什么?我想我可以修改@INC,或者我可以开始使用FindBin,但我不确定哪一个是最好的。我继承了这段代码,只是将其迁移到一个新的位置,但看起来旧代码不需要这样的解决方案(我可能错了,仍然在寻找…)

    3 回复  |  直到 8 年前
        1
  •  37
  •   ikegami Gilles Quénot    7 年前

    Perl不会在当前目录中搜索模块,也不会在脚本目录中搜索模块,至少现在不会了。当前目录已从中删除 @INC 出于安全原因,请参见5.26。

    @公司 早在5.26之前就有马车了。这样做的代码(如您的代码)错误地将当前目录用作脚本目录的代理。这种假设通常是不正确的。

    要让Perl在脚本目录中查找模块,请使用以下命令:

    use FindBin 1.51 qw( $RealBin );
    use lib $RealBin;
    

    use Cwd qw( abs_path );
    use File::Basename qw( dirname );
    use lib dirname(abs_path($0));
    
        2
  •  10
  •   melpomene    8 年前

    . (当前目录) @INC removed in 5.26 出于安全原因( CVE-2016-1238

        3
  •  7
  •   stevieb    8 年前

    删除了Perl 5.26,当前工作目录位于 @INC 作为安全措施。

    5.26 perldelta notes .