繁体   English   中英

Perl:将当前目录包含到@INC?

[英]Perl: Include current directory to @INC?

我正在将一些网站从旧的网络服务器迁移到新的网络服务器。 旧网络服务器使用 Perl 5.8,新网络服务器使用 Perl 5.28。 两者之间的区别之一是在 5.8 中,运行脚本的目录默认包含在 @INC 中。 5.28 并非如此。 这意味着“需要”本地文件的 cgi 脚本会抛出错误。

我知道我可以将这些行添加到脚本中来解决问题:

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

但问题是,我需要为很多脚本执行此操作。

有没有一种方法可以一次性将所有脚本的当前目录 (.) 添加到 @INC? 最好仅适用于 www-data 用户?

export PERL_USE_UNSAFE_INC=1

根据perldelta

PERL_USE_UNSAFE_INC

perl 解释器识别出一个新的环境变量。 如果在 perl 解释器启动时这个变量的值为 1,那么“.” 将自动附加到@INC(在污染下除外)。

这允许您根据具体情况恢复旧的 perl 解释器行为。 但请注意,这只是一个临时的拐杖,这个特性可能会在未来的某个 perl 版本中被删除。 它目前由 cpan 实用程序和 Test::Harness 设置,以简化尚未更新以处理缺少点的 CPAN 模块的安装。 再次重申,除非您确定这不会重新引入任何安全问题,否则不要使用它。

不过,我会听取建议并尽量不鼓励设置。 也许在束缚中,就像您身处其中一样,这可能没问题,因为您已经处于安全风险之中; 但我肯定会确保尽快更新文件并取消设置此变量。

没有全局解决方案,因为您要添加的路径对于每个脚本都是不同的。

人们可能会想添加. ,但是. 指的是当前目录,而不是包含脚本的目录。 这样做是不正确的。


您可以使用以下内容修复文件:

# See what files will be modified.
find . -name '*.pl'

# Actually modify them.
find . -name '*.pl' -exec perl -pe'$_ .= "use FindBin qw( \$RealBin );\nuse lib \$RealBin;\n" if $. == 1' -i~ {} \;

上面做了一个备份。 一旦您对更改感到满意,您可以使用删除备份

# See what files will be deleted.
find . -name '*~'

# Actually delete them.
find . -name '*~' -delete

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM