我有一个关于perl如何执行"do"功能的问题.
假设我有一个类似这样的函数:
sub foo {
package bar;
%bar::h_test = ('b' => 'blah');
}
Run Code Online (Sandbox Code Playgroud)
当使用严格和警告时,这将运行得很好.现在假设我有以下perl脚本,"test.pl":
%h_test = ('b' => 'blah');
Run Code Online (Sandbox Code Playgroud)
现在我可以重写上一个函数,如下所示:
sub foo {
package bar;
do ('test.pl');
}
Run Code Online (Sandbox Code Playgroud)
似乎"do"允许我使用不合格的名称,只要我将它们保存在文件中即可.我理解为什么从设计的角度来看这是有道理的,因为那里的每个脚本都不可能知道谁在调用它.但是,我不确定使用"do"运行代码的准确规则是什么.
那么它是怎样工作的?阅读perldoc并没有对这个问题有所了解
谢谢.
当您未%h_test使用ourin 声明时,没有收到编译时错误的原因test.pl是use strict您在主脚本中拥有的错误不会扩展到该文件test.pl.根据文件:
该
strictpragma禁用某些可能出现异常行为或难以调试的Perl表达式,从而将它们变为错误.此pragma的效果仅限于当前文件或范围块.
另请注意文档do说:
do './stat.pl'很像是:Run Code Online (Sandbox Code Playgroud)eval `cat stat.pl`;除了它更简洁,不运行外部进程,并跟踪错误消息的当前文件名.它的不同之处在于,使用do FILE评估的代码无法在封闭范围内查看词法
此外,根据文档 use strict 'vars',如果名称是完全限定的,则不会生成错误.这就解释了为什么你可以%bar::h_test = ('b' => 'blah')在使用strict和不用声明变量时编写our.