我很好奇是否有关于进行限制性逃避的任何好消息。
查看文档时,use Safe
有一个reval
方法,但我不确定它有多安全。
我想要做的是能够将各种条件语句作为字符串传递给函数,而不会滥用eval。
例如:
sub foo {
my $stmt = shift;
my $a = 3;
say eval($stmt)?"correct":"wrong") , "($stmt)";
}
foo( q{1 == $a} );
foo( q{$a =~ /3/ );
foo( q{(sub {return 3})->() eq 3} );
use Safe
会对此有好处吗?我需要做的就是比较,没有磁盘访问或变量操作。
答案 0 :(得分:4)
作为indicated in the docs,eval($stmt)
在当前Perl程序的词汇上下文中计算$stmt
“,以便之后保留任何变量设置或子例程和格式定义。”这对于延迟执行$stmt
直到运行时非常有用。
如果你在Safe区域中reval($stmt)
,基本上会发生同样的事情,那么该语句是eval'd,但它在新的词汇上下文中得到了评估,它只能看到Safe隔离专区的名称空间,并且您可以控制允许哪种类型的运算符。
所以,是的,如果您在该隔间中声明了一个安全隔间和reval($stmt)
,那么(a)$stmt
的执行不会在未经您同意的情况下改变您的程序的功能(我猜这个是什么意思“没有来源滥用评估”)。并且,(b)是的,如果您$stmt
,reval($stmt)
将无法在未经您同意的情况下访问磁盘。在(a)中“您的同意”要求明确使用符号表,并且在(b)“您的同意”中需要指定一组允许磁盘访问的op codes。
我不确定这也是多么安全。但是,如果您在调试器中设置并逐步执行它,则可以看到它的运行情况。