使用严格模式/非严格模式的括号代码部分?

6

我继承了一些perl代码,当然没有使用strict或warnings,因此我经常使用未初始化的变量等。

我想像这样为我修改的代码部分加上括号:

use warnings;
use strict;

... my code changes and additions ...

no strict;
no warnings;

看起来似乎行得通,但我在破解关于use的官方文档时遇到了问题。当它说这些是编译器指令并导入到当前“块作用域”时,我无法理解其含义。这是否意味着任何范围都可以具有未配对的use strictno strict? 全局范围中的no strict是否实质上撤销了同一范围内先前的use strict的含义?


1
我会确认这是一个好主意,暂时使用现有的代码。更好的方法是将您的添加放入单独的库文件中的函数中。最终,您会想要将所有内容都纳入严格控制之下。 - Schwern
不使用 use strict 的人当然也不允许轻松的代码封装... 我必须添加到他们的 eleventytwo 全局哈希表中,你看... - stevesliva
3
是的,这很令人沮丧,但它并不会阻止您使用库子程序。您可以使用 %main::blah(假设它在 main 包中)引用它们的全局变量。更好的方法是将您需要修改的它们的全局变量通过引用传递到您的子程序中:some_new_sub(\%blah)。这将防止它们的全局变量混乱感染新代码。起初可能会很凌乱,但它会让您更好地了解哪些代码需要哪些数据。在此过程中,“提炼函数”模式将是您最有力的工具。 - Schwern
1个回答

11

“块级作用域”指的是use strict;no strict;都会在它们所在的块以及该块内最近的封闭块的结束之前生效,因此,后面的no strict不会撤销之前的use strict。它只会在代码中从该点开始更改最内层作用域的严格模式设置。

{
    use strict;
    # strict in effect
    {
        # strict still in effect
        no strict;
        # strict not in effect
    }
    # strict in effect
    no strict;
    # strict not in effect
    use strict;
    # strict in effect
}

很好的说明,谢谢。我有两个问题:1)很少有人使用no strict来限制对非严格代码的更改的示例。2)我担心作用域的双重解释可能会导致事情不像所示那样工作,所以确认是好的。 - stevesliva
2
“块作用域”也被称为“词法作用域”。需要注意的是,词法作用域不会进入子程序调用。 “词法”指的是“在页面上读到的内容”。在罕见的情况下,小块中使用no strict通常用于使用符号引用。常见用途是动态创建子例程。{ no strict 'refs'; *{$sub_name} = sub { ... } } - Schwern
1
与“动态作用域”不同,它不进入子程序调用。 - ysth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接