我很好奇是否有任何有关执行受限评估的好信息。
查看文档,有一个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} );
Run Code Online (Sandbox Code Playgroud)
use Safe这样会有好处吗?我需要做的就是比较,无需磁盘访问或变量操作。
如文档中所示,eval($stmt)评估$stmt“在当前 Perl 程序的词法上下文中,以便随后保留任何变量设置或子例程和格式定义”。这对于延迟执行直到运行时很有用$stmt。
如果您reval($stmt)在安全隔间中,本质上会发生相同的事情,该语句将被评估,但它是在新的词法上下文中评估的,该上下文只能看到安全隔间的名称空间,并且您可以在其中控制运算符的类型允许。
所以,是的,如果您声明一个安全隔间并reval($stmt)在该隔间中,那么(a)$stmt在未经您同意的情况下执行不会改变程序的功能(我想这就是您所说的“没有滥用源的源”的意思评估”)。并且,(b) 是的,$stmt如果您不同意,则在未经您同意的情况下将无法访问该磁盘reval($stmt)。在 (a) 中,“您的同意”需要明确地使用符号表,而在 (b) 中,“您的同意”则需要指定一组允许磁盘访问的操作码。
我也不确定这有多安全。但是,如果您在调试器中对其进行设置并单步执行,则可以看到它的运行情况。
| 归档时间: |
|
| 查看次数: |
1480 次 |
| 最近记录: |