【问题标题】:Execution rules when using perl's do.使用 perl 的 do 时的执行规则。
【发布时间】:2018-04-08 17:02:22
【问题描述】:

我有一个关于 perl 如何执行“do”函数的问题。

假设我有一个类似这样的函数:

sub foo {
    package bar;
    %bar::h_test = ('b' => 'blah');
}

当使用严格和警告时,这将运行得很好。 现在假设我有以下 perl 脚本,“test.pl”:

%h_test = ('b' => 'blah');

现在我可以重写之前的函数如下:

sub foo {
    package bar;
    do ('test.pl');
}

似乎“do”允许我使用非限定名称,只要我将它们保存在一个文件中。我理解为什么从设计的角度来看这是有道理的,因为那里的每个脚本都不可能知道是谁在调用它。但是,我不确定使用“do”运行代码的确切规则是什么。

那么,它是如何工作的?阅读 perldoc 并没有对这个主题有太多了解

谢谢。

【问题讨论】:

  • 我不认为do 有什么特别之处。您也可以在第一种情况下使用不合格的名称 %h_test
  • 显然不是,因为我得到“全局符号“%h_test”需要显式包名”。使用 strict 时这是有道理的。
  • 是的,你是对的。如果我删除包名称限定符,我也会收到编译时错误。奇怪的。无论如何,您可以将our 放在声明前面以消除错误
  • 当然可以。但关键是要理解,而不是摆脱编译时错误:)
  • 同样的documentation 还说:“此编译指示的效果仅限于当前文件或范围块”,这可以解释为什么do 工作自它在另一个文件中?

标签: perl semantics


【解决方案1】:

您没有在test.pl 中声明%h_testour 时没有出现编译时错误的原因是您在主脚本中拥有的use strict 没有扩展到文件@ 987654328@。根据the documentation

strict pragma 禁用某些 Perl 表达式 意外或难以调试,将它们变成错误。这 此 pragma 的效果仅限于 当前文件 或范围块。

还要注意the documentation for do 说:

do './stat.pl' 很大程度上类似于:

eval `cat stat.pl`;

除了更简洁,不运行外部进程,并且保持 跟踪错误消息的当前文件名。它也有不同之处 用 do FILE 评估的代码看不到封闭的词法 范围

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

【讨论】:

  • 好的,但是 do FILE 仍然在正确包的上下文中评估代码,即 h_test 应该在其他任何地方引用为 %bar::h_test,即使它是用“do”评估的。看来这个理解是对的。
猜你喜欢
  • 2016-09-04
  • 2020-04-02
  • 2013-04-15
  • 2021-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多