【发布时间】: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工作自它在另一个文件中?