【发布时间】:2018-09-22 02:25:06
【问题描述】:
我正在尝试使用 Perl 的 do EXPR 函数作为穷人的配置解析器,使用第二个 .pl 文件,它只返回一个列表作为配置信息。 (我认为这可能是do 的理想用途,尤其是因为我可以在我的代码中写“do or die”。)这里有一个例子:
main.pl
# Go read the config file
my %config = do './config.pl';
# do something with it
$web_object->login($config{username}, $config{password});
config.pl
# Configuration file for main script
(
username => "username",
password => "none_of_your_business",
favorite_color => "0x0000FF",
);
阅读Perldoc for do 提供了很多关于相对路径的有用建议 - 搜索 @INC 和修改 %INC,关于 5.26 不搜索“.”的特殊警告。等等。但它也有这些位:
# 加载确切的指定文件(./ 和../ 特殊情况)...
使用 do 与相对路径(./ 和 ../ 除外),如...
然后它实际上从不费心解释“./”或“../”的特殊情况路径处理 - 一个重要的遗漏!
所以我的问题都是关于“当你do './file.pl'; 时真正会发生什么”?比如……
- 尽管 CWD 从 @INC 中删除,但此语法在 5.26 中是否仍然有效?
- 无论如何,“./”从谁的角度来看:Perl 二进制文件、执行的 Perl 脚本、来自用户 shell 的 CWD,还是其他?
- 是否存在需要注意的安全风险?
- 这比修改 @INC 并仅使用基本文件名更好还是更糟?
感谢任何见解。
【问题讨论】:
-
Re "然后它实际上从不费心解释“./”或“../”的特殊情况路径处理 - 一个重要的遗漏!”,呵呵, "
do './stat.pl'很像eval `cat stat.pl`;" -
Re "无论如何从谁的角度来看是"./"",Perl 只是将路径传递给操作系统,
.引用 CWD。span> -
Re "是否有需要注意的安全风险?",忘记安全风险,让它工作怎么样。不要对 CWD 做出假设。 Solutions。 (是的,这对 setuid 脚本来说是一个安全风险。)
-
正在回答的问题,我想补充一下——您为什么要这样做?只需正确使用完整路径,例如来自 ikegami 的链接。