使用perl时的执行规则.

Yak*_*Dan 1 perl semantics

我有一个关于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åk*_*and 5

当您未%h_test使用ourin 声明时,没有收到编译时错误的原因test.pluse strict您在主脚本中拥有的错误不会扩展到该文件test.pl.根据文件:

strictpragma禁用某些可能出现异常行为或难以调试的Perl表达式,从而将它们变为错误.此pragma的效果仅限于当前文件或范围块.

另请注意文档do说:

do './stat.pl' 很像是:

eval `cat stat.pl`;
Run Code Online (Sandbox Code Playgroud)

除了它更简洁,不运行外部进程,并跟踪错误消息的当前文件名.它的不同之处在于,使用do FILE评估的代码无法在封闭范围内查看词法

此外,根据文档 use strict 'vars',如果名称是完全限定的,则不会生成错误.这就解释了为什么你可以%bar::h_test = ('b' => 'blah')在使用strict和不用声明变量时编写our.